Sdílet prostřednictvím


Výpisy chybových stavů systému Linux

Tento článek popisuje, jak vytvořit a zobrazit různé typy souborů se záznamem pádu systému Linux. Zobrazení chybových výpisů systému Linux vyžaduje verzi WinDbg 1.2402.24001.0 nebo vyšší.

Při otevření výpisu jádra Systému Linux (jiné než Windows) v systému WinDbg by měly všechny příkazy základního ladicího programu správně fungovat, ale rozšíření a příkazy specifické pro Windows, které odkazují na struktury Systému Windows, nebudou fungovat.

Podporované soubory výpisu stavu systému

Výpisy paměti jádra Linuxu

Otevření komprimovaných KDUMPů linuxového jádra a provádění postmortem ladění a analýzy s úplnými privátními DWARF symboly je k dispozici v ladicím programu pro Windows.

WinDbg podporuje pouze komprimované soubory KDUMP z knihovny ZLIB. LZO a Snappy komprimované KDUMPy nejsou podporovány.

Obecné informace o linuxovém KDumpu najdete na stránce Wikipedie KDump (Linux) a Core dump.

Výpisy paměti jádra ve formátu ELF

Jako součást podpory Open Enclave může WinDbg otevřít ELF core výpisy a binární soubory a také symboly DWARF (DWARF 5 není podporován) z enkláv i Linuxových aplikací. Další informace o funkci Open Enclave naleznete v tématu Ladění Open Enclave.

Výpisy stavu procesu

Podporují se výpisy paměti jednoho procesu. Existuje řada způsobů, jak shromáždit výpis procesu, včetně Linux Sysinternals ProcDump pro Linux utility. Další možností je použít GNU Debugger - GDBServer k vygenerování výpisu jádra. Další informace o GDBServer naleznete v tématu https://en.wikipedia.org/wiki/Gdbserver. Dokumentace ke vzdálenému ladění gdb je k dispozici na webu zdrojového softwaru – Ladění vzdálených programů.

Rozšiřitelnost standardní knihovny šablon (STL) v ladicících programech Windows je poskytována souborem NatVis, stl.natvis který rozumí mnoha verzím STL, které jsou dodávány se sadou Visual Studio a Windows. Obecné informace o nástroji NATVIS naleznete v tématu Nativní objekty ladicího programu v NatVis. Verze STL, které se používají pro komponenty Linuxu (GCC nebo LLDB), se velmi liší.

Pokud chcete povolit vizualizaci NATVIS a procházení odkazů DML optimalizované pro Linux, nejprve rozbalte výchozí soubor natvis .scriptunloadstl.natvis.

Pak spusťte soubor gstl.natvis. Pomocí souboru .scriptlist potvrďte, že gstl.natvis je aktivní.

0: kd> .scriptlist
Command Loaded Scripts:
...
    NatVis script from 'C:\Users\Bob\AppData\Local\dbg\UI\2402.24001.0\amd64\Visualizers\gstl.natvis'

Další informace o práci s DML naleznete v tématu Přizpůsobení výstupu ladicího programu pomocí DML.

Jádrový výpis jednoho procesu aplikace DisplayGreeting

Tento příklad ukazuje, jak vytvořit jeden výpis paměti jádra procesu pomocí gdb. Další informace o použití GDBServer s WinDbg a návod kódu naleznete v tématu Ladění vzdáleného procesu v reálném Linuxu. Příklad kódu pro DisplayGreeting najdete v návodu k aplikaci jazyka C++.

Vyhledání požadovaného procesu

Pomocí příkazu můžeme buď vypsat všechny procesy v Linuxu ps -A , nebo použít možnost -f s příkazem pgrep, protože víme, že hledáme aplikaci DisplayGreeting.

$ pgrep -f DisplayGreeting
9382

V tomto návodu se ukazuje ID procesu 9382.

Připojit k procesu pomocí gdb a vytvořit výpis paměti jádra

K připojení k procesu použijte gdb.

$ gdb -p 9382

Zobrazit nápovědu pro příkaz generate-core-file gdb

(gdb) help generate-core-file
Save a core file with the current state of the debugged process.
Argument is optional filename.  Default filename is 'core.<process_id>'.

Pak na výzvě GDB vygenerujte soubor výpisu paměti procesu s výchozím názvem souboru.

(gdb) generate-core-file
Saved corefile core.9382
(gdb) quit

Načíst a prozkoumat výpis paměti procesu Linuxu

Pomocí možnosti Otevřít soubor s výpisem paměti v WinDbg načtěte vygenerovaný výpis paměti jádra.

Přidejte cesty ke zdroji a symbolům do relace ladicího programu

Pokud chcete zobrazit zdrojový kód a proměnné, nastavte symboly a cestu ke zdroji. Obecné informace o nastavení cesty symbolů naleznete v tématu Použití symbolů. Podrobnější informace o symbolech Linuxu najdete v tématu Symboly a zdroje Linuxu.

Použijte .sympath k přidání cesty symbolu do relace ladicího programu. V tomto příkladu WSL Linux Ubuntu jsou kód a symboly DisplayGreetings k dispozici na tomto místě pro uživatele jménem Bob.

\\wsl$\Ubuntu\mnt\c\Users\Bob\

Ve WSL se tento adresář mapuje na umístění operačního systému Windows: C:\Users\Bob\ Proto se použijí tyto dva příkazy.

.sympath C:\Users\Bob\

.srcpath C:\Users\Bob\

Další informace o přístupu k systému souborů WSL ve Windows naleznete v tématu Oprávnění k souborům pro WSL.

Pokud chcete využívat další symboly operačního systému Linux, přidejte symboly DebugInfoD pomocí umístění .sympath.

.sympath+ DebugInfoD*https://debuginfod.elfutils.org

Použijte příkaz .reload k znovu načtení symbolů.

Podporuje se také automatické stahování zdrojů ze serverů DebugInfoD, které podporují vrácení tohoto typu artefaktu. Pokud chcete tuto funkci využít, přidejte server elfutils pomocí cesty .srcpath.

.srcpath+ DebugInfoD*https://debuginfod.elfutils.org

Zkoumání výpisu stavu procesu

Pomocí příkazu lm potvrďte, že soubor s výpisem dat obsahuje aplikaci DisplayGreeting.

0:000> lm
start             end                 module name
00005555`55554000 00005555`55558140   DisplayGreeting T (service symbols: DWARF Private Symbols)        c:\users\bob\DisplayGreeting
00007fff`f7a54000 00007fff`f7a732e8   libgcc_s_so   (deferred)    
00007fff`f7a74000 00007fff`f7b5a108   libm_so    (deferred)    
00007fff`f7b5b000 00007fff`f7d82e50   libc_so  T (service symbols: DWARF Private Symbols)        C:\ProgramData\Dbg\sym\_.debug\elf-buildid-sym-a43bfc8428df6623cd498c9c0caeb91aec9be4f9\_.debug
00007fff`f7d83000 00007fff`f7fae8c0   libstdc___so   (deferred)    
00007fff`f7fc1000 00007fff`f7fc1000   linux_vdso_so   (deferred)    
00007fff`f7fc3000 00007fff`f7ffe2d8   ld_linux_x86_64_so T (service symbols: DWARF Private Symbols)        C:\ProgramData\Dbg\sym\_.debug\elf-buildid-sym-9718d3757f00d2366056830aae09698dbd35e32c\_.debug

Všimněte si, že první spuštění příkazu může nějakou dobu trvat, protože symboly ladění se načtou do mezipaměti. Kromě hledání symbolů a binárních souborů prostřednictvím serveru symbolů nebo místní cesty hledání může kvůli integraci GDBServer tyto soubory načíst ze vzdáleného systému souborů, pokud se nedají najít místně. Tato operace je obvykle pomalejší než získání symbolů ze symsrv nebo místní vyhledávací cesty.

x Pomocí příkazu zobrazte funkce dostupné v DisplayGreeting.

0:000> x /D /f DisplayGreeting!*
 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

*** WARNING: Unable to verify timestamp for DisplayGreeting
00005651`7935b331 DisplayGreeting!_GLOBAL__sub_I__Z17GetCppConGreetingPwm (void)
00005651`7935b2db DisplayGreeting!__static_initialization_and_destruction_0 (int, int)
00005651`7935b37b DisplayGreeting!std::__array_traits<wchar_t, 50>::_S_ptr (wchar_t (*)[50])
00005651`7935b368 DisplayGreeting!std::array<wchar_t, 50>::size (std::array<wchar_t, 50> *)
00005651`7935b34a DisplayGreeting!std::array<wchar_t, 50>::data (std::array<wchar_t, 50> *)
00005651`7935b225 DisplayGreeting!main (void)
00005651`7935b1e9 DisplayGreeting!GetCppConGreeting (wchar_t *, size_t)

Příkazem dx zobrazte místní proměnnou greeting.

0:000> dx greeting
...
Error: Unable to bind name 'greeting'

Vzhledem k tomu, že parametr 'greeting' nebyl při výpisu ještě použit, není v souboru s výpisem k dispozici.

Pomocí příkazu dx zkontrolujte procesy, které jsou k dispozici v souboru s výpisem.

:000> dx @$cursession.Processes.Take(30)
@$cursession.Processes.Take(30)                
    [0x24a6]         : DisplayGreeting [Switch To]

Click on the `[Switch To]` DML link to switch to the 9382 process.

```dbgcmd
0:000> dx -s @$cursession.Processes.Take(30)[9382].SwitchTo()
0:000> dx -r1 @$cursession.Processes.Take(30)[9382]
@$cursession.Processes.Take(30)[9382]                 : DisplayGreeting [Switch To]
    Name             : DisplayGreeting
    Id               : 0x24a6
    Index            : 0x0
    Handle           : 0x24a6
    Threads         
    Modules         
    Environment     
    Direct3D        
    Attributes      
    Devices         
    Io              
    Memory          
    TTD    
    GroupedStacks   

Pokud chcete zobrazit informace o vláknech a modulech, klikněte ve výstupu na vygenerovaný odkaz DML nebo zadejte příkazy podobné tomuto pro výpis stavu systému.

0:000> dx -r1 @$cursession.Processes.Take(30)[9382].Threads
@$cursession.Processes.Take(30)[9382].Threads       
    [0x24a6]         [Switch To]
0:000> dx -r1 @$cursession.Processes.Take(30)[9382].Modules
@$cursession.Processes.Take(30)[9382].Modules       
    [0x0]            : /mnt/c/Users/Bob/DisplayGreeting
    [0x1]            : /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
    [0x2]            : /usr/lib/x86_64-linux-gnu/libm.so.6
    [0x3]            : /usr/lib/x86_64-linux-gnu/libc.so.6
    [0x4]            : /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
    [0x5]            : /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    [0x6]            : linux-vdso.so.1

Použijte diagnostická rozšíření ELF/CORE k zobrazení informací o souboru s výpisem paměti.

K zobrazení informací o datovém dumpu použijte rozšíření diagnostiky - Linuxu ELFBinComposition.dll. Použijte například !dumpdebug k potvrzení, že se jedná o výpis uživatelského jádra ELF, a k zobrazení dalších informací.

0:000> !dumpdebug
Dump Diagnostics: Format = ELF User Core
********************************************************************************
File Mapping Size:           0x151d78 (1 Mb)
Highest Memory Offset:       0x14e5f0 (1 Mb)
...

Slouží !ntprpsinfo k zobrazení NT_PRPSINFO dat.

0:000> !ntprpsinfo
NT_PRPSINFO (process info):
    state: 0, sname: t, zomb: 0, nice: 0, flag: 0x4040000019999999
    uid: 1000, gid: 1000, pid: 9382, ppid: 388, pgrp: 9382, sid: 388
    fname: DisplayGreeting
    psargs: ./DisplayGreeting

Výpisy paměti při havárii KDump jádra

Existuje mnoho způsobů, jak vytvořit soubor s výpisem stavu systému v Linuxu. Například jedna možnost s Ubuntu Linuxem je popsaná v výpisu stavu jádra.

Mezi další možnosti patří použití kexectools pro povolení Kdump. Další informace najdete v tématu KDump (Linux). Pokud je povolen kdump, můžete ověřit, zda je kdump aktivní a spuštěn pomocí systemctl status kdump.

Po aktivaci chybového ukončení operačního systému v testovacím systému se vytvoří soubor s výpisem stavu systému.

Načti a prozkoumej výpis havárie systému Linux.

K načtení vygenerovaného souboru kdump použijte nabídku Otevřít soubor s výpisem paměti.

Jak je popsáno v předchozí části, povolte vizualizaci NATVIS a procházení odkazů DML optimalizované pro Linux načtením gstl.natvis souboru.

Analýza výpisu stavu jádra Linuxu pomocí příkazů elF Bin composition

Abyste mohli použít další příkazy složení ELF Bin, pro ověření pomocí příkazu .chain ověřte, že je načten ELFBinComposition.dll.

0: kd> .chain
Extension DLL chain:
    ELFBinComposition: image 10.0.27606.1000, API 0.0.0, 
        [path: C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\ELFBinComposition.dll]
...

Pokud není ELFBinComposition načtena, použijte .load k jejímu načtení. Další informace naleznete v tématu .load, .loadby (Load Extension DLL)

Použijte příkaz !ELFBinComposition.dumpdebug k zobrazení informací o načteném souboru s výpisem paměti. V tomto příkladu byl načten soubor s výpisem paměti jádra uživatele ELF.

0: kd> !ELFBinComposition.dumpdebug
Dump Diagnostics: Format = Kernel KDump
********************************************************************************
File Mapping Size:           0x3b34090 (59 Mb)
Highest Memory Offset:       0x3b34090 (59 Mb)

Pomocí ELFBinComposition !vmcoreinfo zobrazte tabulku VMCOREINFO z paměťového výpisu jádra Linuxu (KDUMP), který je právě laděn.

0: kd> !vmcoreinfo
VMCOREINFO:
    OSRELEASE=6.5.0-25-generic
    BUILD-ID=8567ad7c7c2f78f3654f6cc90a9e1b3f9c3a4b32
    PAGESIZE=4096
    SYMBOL(init_uts_ns)=ffffded86e11b388
    OFFSET(uts_namespace.name)=0
    SYMBOL(node_online_map)=ffffded86dcceb40
    SYMBOL(swapper_pg_dir)=ffffded86d143000
    SYMBOL(_stext)=ffffded86ace0000
    SYMBOL(vmap_area_list)=ffffded86de48140
    SYMBOL(mem_section)=ffff0f2e1efe4600
    LENGTH(mem_section)=8192
...

Použijte !kdumppagerange k výpisu první části výpisového souboru počínaje od nuly.

0: kd> !kdumppagerange 0
    PFNs [0x540e0, 0x55643) -> Descs [0x0, 0x1563): File Offsets [0x307430, 0xeeb37a) 0xbe3f4a bytes across 5475 pages as ZLIB
    PFNs [0x55643, 0x55650) -> Descs [0x1563, 0x1570): File Offsets [0x306430, 0x307430) 0x1000 bytes across 13 duplicate pages as Uncompressed
    PFNs [0x55650, 0x556d6) -> Descs [0x1570, 0x15f6): File Offsets [0xeeb37a, 0xf0c405) 0x2108b bytes across 134 pages as ZLIB
    PFNs [0x556d6, 0x556dc) -> Descs [0x15f6, 0x15fc): File Offsets [0xf0c405, 0xf12405) 0x6000 bytes across 6 pages as Uncompressed
    PFNs [0x556dc, 0x55e98) -> Descs [0x15fc, 0x1db8): File Offsets [0xf12405, 0x1216d1b) 0x304916 bytes across 1980 pages as ZLIB
    PFNs [0x55e98, 0x55ea4) -> Descs [0x1db8, 0x1dc4): File Offsets [0x1216d1b, 0x1222d1b) 0xc000 bytes across 12 pages as Uncompressed
    PFNs [0x55ea4, 0x56542) -> Descs [0x1dc4, 0x2462): File Offsets [0x1222d1b, 0x14ba138) 0x29741d bytes across 1694 pages as ZLIB
    PFNs [0x56542, 0x56543) -> Descs [0x2462, 0x2463): File Offsets [0x306430, 0x307430) 0x1000 bytes across 1 pages as Uncompressed
    PFNs [0x56543, 0x56544) -> Descs [0x2463, 0x2464): File Offsets [0x14ba138, 0x14ba194) 0x5c bytes across 1 pages as ZLIB
    PFNs [0x56544, 0x5654f) -> Descs [0x2464, 0x246f): File Offsets [0x306430, 0x307430) 0x1000 bytes across 11 duplicate pages as Uncompressed

Výstup !kdumppagerange zobrazuje různé hodnoty rámce stránky (PFN). Můžeme vybrat jeden, který nás zajímá, a použít !kdumppfn <PFN> k zobrazení informací o PFN a kde se nachází jeho data v rámci KDUMP.

0: kd> !kdumppfn 0x540e0
    Page frame 0x540e0 = File offset [0x307430, 0x307b9f) 0x76f bytes as ZLIB...

Prozkoumat soubor s výpisem paměti

k Pomocí příkazu zobrazte zásobník volání a prozkoumejte, jaký kód se spustil, když došlo k chybě.

6: kd> k
 # Child-SP          RetAddr               Call Site
00 ffff0000`0bc3bc90 ffff0000`085161f8     vmlinux!sysrq_handle_crash+0x24 [/usr/src/kernel/drivers/tty\sysrq.c @ 147] 
01 ffff0000`0bc3bca0 ffff0000`08516824     vmlinux!__handle_sysrq+0x88 [/usr/src/kernel/drivers/tty\sysrq.c @ 583] 
02 ffff0000`0bc3bcb0 ffff0000`08308990     vmlinux!write_sysrq_trigger+0xb4 [/usr/src/kernel/drivers/tty\sysrq.c @ 1110] 
03 ffff0000`0bc3bcf0 ffff0000`08290070     vmlinux!proc_reg_write+0x80 [/usr/src/kernel/fs/proc\inode.c @ 245] 
04 ffff0000`0bc3bd10 ffff0000`0829039c     vmlinux!__vfs_write+0x60 [/usr/src/kernel/fs\read_write.c @ 490] 
05 ffff0000`0bc3bd50 ffff0000`08290704     vmlinux!vfs_write+0xac [/usr/src/kernel/fs\read_write.c @ 550] 
06 ffff0000`0bc3be00 ffff0000`082907a4     vmlinux!ksys_write+0x74 [/usr/src/kernel/fs\read_write.c @ 599] 
07 (Inline Function) --------`--------     vmlinux!__do_sys_write+0xc [/usr/src/kernel/fs\read_write.c @ 608] 
08 (Inline Function) --------`--------     vmlinux!__se_sys_write+0xc [/usr/src/kernel/fs\read_write.c @ 608] 
09 ffff0000`0bc3be40 ffff0000`08095904     vmlinux!__arm64_sys_write+0x24 [/usr/src/kernel/fs\read_write.c @ 608] 
0a ffff0000`0bc3be90 ffff0000`080834c8     vmlinux!el0_svc_handler+0x94
0b ffff0000`0bc3beb0 00000000`00000000     vmlinux!el0_svc+0x8

Pomocí příkazu dx prozkoumejte soubor s výpisem paměti. Podívejte se například na prvních 30 procesů pomocí tohoto příkazu.

6: kd> dx @$cursession.Processes.Take(30)
@$cursession.Processes.Take(30)                
    [0x0]            : swapper/0 [Switch To]
    [0x1]            : systemd [Switch To]
    [0x2]            : kthreadd [Switch To]
    [0x3]            : rcu_gp [Switch To]
    [0x4]            : rcu_par_gp [Switch To]
    [0x5]            : kworker/0:0 [Switch To]
    [0x6]            : kworker/0:0H [Switch To]
    [0x7]            : kworker/u16:0 [Switch To]
    [0x8]            : mm_percpu_wq [Switch To]
    [0x9]            : ksoftirqd/0 [Switch To]
    [0xa]            : rcu_sched [Switch To]
    [0xb]            : rcu_bh [Switch To]
    [0xc]            : migration/0 [Switch To]
...

Klikněte na odkazy DML nebo použijte příkazy podobné těmto, abyste viděli vlákna ve vámi zvoleném procesu.

6: kd> dx @$cursession.Processes[0x1a].Threads
@$cursession.Processes[0x1a].Threads                
    [0x1a]           [Switch To]
6: kd> dx @$cursession.Processes[0x1a].Threads[0x1a]
@$cursession.Processes[0x1a].Threads[0x1a]                 [Switch To]
    KernelObject     [Type: thread_struct]
    Id               : 0x1a
    Stack           
    Registers       
    Environment     
    Analysis        
    WaitChain       
    Scheduling      
    IRPs            
...

Další informace pro každé vlákno jsou k dispozici, jak je znázorněno níže.

6: kd> dx @$cursession.Processes[0x1a].Threads[0x1a].KernelObject
@$cursession.Processes[0x1a].Threads[0x1a].KernelObject                 [Type: thread_struct]
    [+0x000] cpu_context      [Type: cpu_context]
    [+0x070] uw               [Type: <unnamed-tag>]
    [+0x290] fpsimd_cpu       : 0x100 [Type: unsigned int]
    [+0x298] sve_state        : 0x0 [Type: void *]
    [+0x2a0] sve_vl           : 0x0 [Type: unsigned int]
    [+0x2a4] sve_vl_onexec    : 0x0 [Type: unsigned int]
    [+0x2a8] fault_address    : 0x0 [Type: long unsigned int]
    [+0x2b0] fault_code       : 0x0 [Type: long unsigned int]
    [+0x2b8] debug            [Type: debug_info]
6: kd> dx -s @$cursession.Processes[0x1a].Threads[0x1a].SwitchTo()
Process ffff8008`0f894380 has invalid page directories

Použití skriptu LinuxKernel.js k analýze výpisu paměti jádra Linuxu

Rozšíření ladicího programu LinuxKernel.js obsahuje sadu příkazů navržených tak, aby fungovaly podobně jako v linuxovém nástroji pro chybové ukončení, které slouží k otevření a analýze chybových ukončení linuxového režimu jádra.

Pokud chcete skript použít, nejprve ho načtěte.

0: kd> .scriptload LinuxKernel.js
JavaScript script successfully loaded from 'C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\LinuxKernel.js'

Další informace o práci se skripty načítání naleznete v tématu JavaScript Debugger Scripting.

!soubory

!files Slouží k zobrazení informací o struktuře souborů Linuxu v souboru s výpisem paměti. Podobá se příkazu pro soubory při havárii.

6: kd> !files
@$files()                 : Files for process 'sh' (pid 545) root dir = '/' working dir = '/home/root'
    [0x0]            : /dev/ttyS0 [Type: file]
    [0x1]            : /proc/sysrq-trigger [Type: file]
    [0x2]            : /dev/ttyS0 [Type: file]
    [0xa]            : /dev/ttyS0 [Type: file]
    [0xff]           : /dev/ttyS0 [Type: file]

!files syntaxe:

!files [<arg>]

Bez [<arg>]– ekvivalent k souborům – poskytuje seznam souborů aktuálního procesu.

[<arg>]:

pid - Poskytne seznam souborů pro dané ID procesu.

64-bit num - Poskytuje seznam souborů pro úkol na dané adrese.

<task struct [*]> - Poskytuje seznam souborů pro danou strukturu úkolu podle objektu.

<process object> - Poskytuje seznam souborů pro úkol reprezentovaný objektem procesu.

!připojit

!mount Slouží k zobrazení informací o struktuře souborů Linuxu v souboru s výpisem paměti.

6: kd> !mount
@$mount()                
    [0x0]            : (rootfs) rootfs at / [Type: mount]
    [0x1]            : (squashfs) /dev/mapper/nested_rootfs at / [Type: mount]
    [0x2]            : (sysfs) sysfs at /sys [Type: mount]
    [0x3]            : (proc) proc at /proc [Type: mount]
    [0x4]            : (devtmpfs) devtmpfs at /dev [Type: mount]
    [0x5]            : (securityfs) securityfs at /kernel/security [Type: mount]

!mount syntaxe:

Bez [<arg>]– ekvivalent příkazu mount – zobrazuje připojené systémy souborů.

[<arg>]:

pid - Zobrazuje připojené systémy souborů pro prostor názvů procesu s daným PID

64-bit num - Poskytuje připojené systémy souborů pro obor názvů task_struct dané adresou.

<task struct [*]> - Poskytuje připojené souborové systémy pro jmenný prostor daného task_struct

<process object> - Poskytuje systémy souborů připojené do jmenného prostoru úlohy reprezentované procesem.

!síť

!net Umožňuje zobrazit seznam systémových sítí.

6: kd> !net
@$net()                
    [0x0]            : lo (127.0.0.1) [Type: net_device]
    [0x1]            : enP8p1s0f0np0 (192.168.3.19) [Type: net_device]
    [0x2]            : enP8p1s0f1np0 [Type: net_device]

!net syntaxe:

!net [<arg>]

Bez [<arg>]– ekvivalent k síti – poskytuje seznam sítí systému.

[<arg>]:

pid - Poskytuje seznam sítí pro obor názvů procesu s daným PID

64-bit num - Poskytuje čistý seznam pro obor názvů task_struct zadaný adresou.

<task struct [*]> - Poskytuje seznam sítí pro obor názvů daného task_struct

<process object> - Poskytuje síťový seznam pro obor názvů úlohy, kterou zastupuje proces.

!runq

Použijte !runq k zobrazení informací o úlohách ve frontě spuštění.

0: kd> !runq
@$runq()                
    [0x0]            : CPU 0 run queue [current = 'bash' (17ca)]
        Cpu              : 0x0
        RunQueue         [Type: rq]
        CurrentTask      : bash [Type: task_struct]
        RTTasks         
        CfsTasks        
            [0x16b3]         : kworker/0:7 [Type: task_struct]
    [0x1]            : CPU 1 run queue [current = 'swapper/1' (0)]
        Cpu              : 0x1
        RunQueue         [Type: rq]
        CurrentTask      : swapper/1 [Type: task_struct]
        RTTasks         
        CfsTasks   

!runq syntaxe:

!runq

!runq nemá žádné parametry příkazu.

Další příkazy výpisu stavu jádra

!dev - Zobrazí data zařízení týkající se znakových a blokových zařízení, přiřazení, využití vstupně-výstupních portů a využití vstupně-výstupní paměti.

!log – Zobrazí obsah log_buf jádra.

!vm – Zobrazí souhrn využití virtuální paměti.

!timer – Zobrazí položky fronty časovače.

dx – příkazy a linuxové objekty

Příkaz dx lze použít k prošetření kdumps. Zobrazte objekt Sezení, pro zobrazení různých podřízených objektů, které máte k dispozici.

0: kd> dx -r3 Debugger.Sessions[0]
Debugger.Sessions[0]                 : Target Composition Target
    Processes       
        [0x0]            : swapper/0 [Switch To]
            KernelObject     : swapper/0 [Type: task_struct]
            Name             : swapper/0
            Id               : 0x0
            Index            : 0x0
            Threads         
            Modules         
            Environment     
            Direct3D        
            Attributes      
            Devices         
            Io              
            Memory          
            GroupedStacks   
...

Objekt jádra cursession obsahuje objekt PrintKLog, který lze použít k zobrazení záznamu jádra.

6: kd> dx @$cursession.Kernel.PrintKLog.Take(4)
@$cursession.Kernel.PrintKLog.Take(4)                
    [0x0]            : [     0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
    [0x1]            : [     0.000000] Linux version 4.19.90-microsoft-standard (oe-user@oe-host) (gcc version 8.2.0 (GCC)) #1 SMP Fri Mar 27 14:25:24 UTC 2020..
    [0x2]            : [     0.000002] sched_clock: 64 bits at 125MHz, resolution 8ns, wraps every 4398046511100ns
    [0x3]            : [     0.000003]         17.250901928 MSFT: kernel boot start

Tento příkaz dx ukazuje použití .Contains() k vyhledání konkrétních řetězců v protokolu.

6: kd> dx @$cursession.Kernel.PrintKLog.Where(le => le.ToLower().Contains("oops") || le.ToLower().Contains("crash"))
@$cursession.Kernel.PrintKLog.Where(le => le.ToLower().Contains("oops") || le.ToLower().Contains("crash"))                
    [0x0]            : [     0.000493] crashkernel reserved: 0x00000000dc600000 - 0x00000000fc600000 (512 MB)
    [0x1]            : [     0.078790] Kernel command line: console=ttyS0,115200n8 earlycon=uart8250,mmio32,0x68A10000 crashkernel=512M enforcing=0 ipe.enforce=0
    [0x2]            : [    26.621228] sysrq: SysRq : Trigger a crash
    [0x3]            : [    26.621254] Internal error: Oops: 96000044 [#1] SMP
    [0x4]            : [    26.656655] pc : sysrq_handle_crash+0x24/0x30
    [0x5]            : [    26.753494]  sysrq_handle_crash+0x24/0x30
    [0x6]            : [    26.801441] Starting crashdump kernel...8J»=.

Slouží .Reverse() k zobrazení posledních událostí protokolovaných.

2: kd> dx @$cursession.Kernel.PrintKLog.Reverse().Take(5).Reverse()
@$cursession.Kernel.PrintKLog.Reverse().Take(5).Reverse()
   [0x0]           : [3147944.378367]  kthread+0x118/0x2a4
   [0x1]           : [3147944.381876]  ret_from_fork+0x10/0x18
   [0x2]           : [3147944.385747] Code: 78002507 36000042 39000107 d65f03c0 (cb0803e4)
   [0x3]           : [3147944.392221] SMP: stopping secondary CPUs
   [0x4]           : [3147944.397539] Starting crashdump kernel...

Další informace o použití dotazů LINQ s příkazem dx naleznete v tématu Použití LINQ s objekty ladicího programu.

Rozšíření diagnostiky Linuxu – ELFBinComposition.dll

Následující diagnostické rozšíření linuxových výpisových souborů jsou k dispozici v ELFBinComposition.dll.

Příkazy pro výpis souborů

Tyto příkazy lze použít u většiny souborů s výpisem paměti.

!dumpdebug – Zobrazí diagnostiku pro ladění výpisu paměti jádra. To zahrnuje výstup různých dalších příkazů.

!ntprstatus – Zobrazit záznamy NT_PRSTATUS z rozpracovaného základního výpisu.

!vmcoreinfo – Zobrazí tabulku VMCOREINFO z laděného výpisu jádra (KDUMP).

Příkazy výpisu stavu systému ELF

Tyto příkazy lze použít pouze u souborů výpisu jádra ELF.

!corephdrs – Zobrazí tabulku záhlaví programu pro laděný výpis paměti jádra.

!ntprpsinfo – Zobrazit data NT_PRPSINFO z výpisu paměti jádra.

!ntfile – Zobrazí NT_FILE data z laděného výpisu paměti jádra.

!ntauxv – Zobrazí NT_AUXV data z laděného výpisu stavu jádra.

Příkazy souboru výpisu stavu systému jádra

Tyto příkazy lze použít pouze u souborů s výpisem jádra (KDUMP).

!kdumpdescs - Zobrazí seznam rozsahů stránek a popisovačů stránek v KDUMP.

!kdumppagerange <n> - Zobrazí informace o n-té skupině stránek v KDUMP.

!kdumppfn <pfn> - Zobrazí informace o rámečku <pfn> stránky a kde jsou jeho data v KDUMP.

Další diagnostické příkazy

!cppex – Zobrazí informace o aktuálních výjimkách jazyka C++ pro aktuální vlákno (nezachycené a "jen" zachycené) pomocí vnitřních struktur knihovny libstdc++ a symbolů TRPASLÍKU.

!cppfilt [-n] <mangled name> – Rekonstruuje zkomolený název C++, jako by byl zpracován pomocí nástroje c++filt. Další informace o nástroji C==filtr naleznete na stránce c++filt(1) – ruční stránka Linuxu.

!rustdemangle <mangled name> - Dekóduje zkreslené jméno Rust. Další informace o změně názvů symbolů v Rustu naleznete v Rust Symbol Mangling - RFC 2603.

Viz také

symboly a zdroje Linuxu

ladění živých procesů systému Linux na dálku