Condividi tramite


Dump di arresto anomalo di Linux

Questo articolo descrive come creare e visualizzare diversi tipi di file di dump di arresto anomalo di Linux. La visualizzazione dei dump di arresto anomalo di Linux richiede WinDbg versione 1.2402.24001.0 o successiva.

Quando si apre un dump di core Linux (non Windows) in WinDbg, i comandi del debugger di base devono funzionare correttamente, ma le estensioni e i comandi specifici di Windows che fanno riferimento alle strutture di Windows, non funzioneranno.

File di dump di arresto anomalo supportati

Dump del kernel Linux

L'apertura di KDUMP compressi del kernel Linux e l'esecuzione di debug e analisi post-mortem con simboli NANi completi privati sono disponibili nel debugger di Windows.

WinDbg supporta solo i file KDUMP compressi ZLIB. LZO e Snappy compressi KDUMP non sono supportati.

Per informazioni generali sui KDUMP Linux, vedere la pagina di Wikipedia di KDump (Linux) e il dump di Core.

Dump di core ELF

Come parte del supporto di Open Enclave, WinDbg può aprire dump e file binari di core ELF, nonché simboli NANO (NANO 5 non è supportato) da enclave e applicazioni Linux. Per altre informazioni su Open Enclave, vedere Debug open enclave.

Dump di processo

Sono supportati i dump di un singolo processo. Esistono diversi modi per raccogliere un dump del processo, tra cui l'utilità Linux Sysinternals ProcDump per Linux . Un'altra opzione consiste nell'usare GNU Debugger - GDBServer per generare un dump di base. Per altre informazioni su GDBServer, vedere https://en.wikipedia.org/wiki/Gdbserver. La documentazione per il debug remoto di gdb è disponibile nel sito Web Sourceware - Debug di programmi remoti.

L'estendibilità STL (Standard Template Library) nei debugger di Windows viene fornita da un file NatVis, stl.natvis che comprende molte versioni della libreria STL fornita con Visual Studio e Windows. Per informazioni generali su NATVIS, vedere Oggetti debugger nativi in NatVis. Le versioni di STL usate per i componenti Linux (GCC o LLDB) sono molto diverse.

Per abilitare la visualizzazione NATVIS e l'attraversamento dei collegamenti DML ottimizzati per Linux, scaricare prima il file natvis predefinito, con estensione scriptunload stl.natvis.

Quindi eseguire lo scriptload del gstl.natvis file. Usare .scriptlist per verificare che gstl.natvis sia attivo.

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

Per altre informazioni sull'uso di DML, vedere Personalizzazione dell'output del debugger tramite DML.

Dump dei core di processo singolo dell'app DisplayGreeting

Questo esempio illustra come creare un singolo dump di core di processo usando gdb. Per altre informazioni sull'uso di GDBServer con WinDbg e una procedura dettagliata per il codice, vedere Debug di processi remoti live linux. Per il codice di esempio per DisplayGreeting, vedere Procedura dettagliata per l'app C++.

Individuare il processo desiderato

È possibile elencare tutti i processi in Linux usando il ps -A comando oppure usare l'opzione -f con pgrep, come si sa che si sta cercando l'app DisplayGreeting.

$ pgrep -f DisplayGreeting
9382

In questa procedura dettagliata di esempio viene visualizzato un ID processo 9382.

Connettersi al processo con gdb e generare un dump di core

Usare gdb per connettersi al processo.

$ gdb -p 9382

Visualizzare la Guida per il generate-core-file comando 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>'.

Al prompt (gdb) generare quindi un file di dump del core del processo con il nome file predefinito.

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

Caricare ed esaminare il dump del core del processo Linux

Usare l'opzione di menu Apri file di dump in WinDbg per caricare il dump del core generato.

Aggiungere i percorsi di origine e simboli alla sessione del debugger

Per visualizzare il codice sorgente e le variabili, impostare i simboli e il percorso di origine. Per informazioni generali sull'impostazione del percorso dei simboli, vedere Uso dei simboli. Per informazioni più dettagliate sui simboli Linux, vedere Simboli e origini Linux.

Usare .sympath per aggiungere il percorso del simbolo alla sessione del debugger. In questo esempio di WSL Linux Ubuntu, il codice e i simboli DisplayGreetings sono disponibili in questo percorso, per un utente di nome Bob.

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

In WSL questa directory viene mappata alla posizione del sistema operativo Windows di : C:\Users\Bob\ quindi vengono usati questi due comandi.

.sympath C:\Users\Bob\

.srcpath C:\Users\Bob\

Per altre informazioni sull'accesso al file system WSL in Windows, vedere Autorizzazioni file per WSL.

Per trarre vantaggio da altri simboli del sistema operativo Linux, aggiungere i simboli DebugInfoD usando il percorso con estensione sympath.

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

Usare il .reload comando per ricaricare i simboli.

È supportato anche il download automatico delle origini dai server DebugInfoD, che supportano la restituzione di tale tipo di artefatto. Per sfruttare questa funzionalità, aggiungere il server elfutils usando .srcpath.

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

Esame del dump del processo

Usare il lm comando per verificare che il file di dump contenga l'app 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

Si noti che la prima esecuzione del comando può richiedere un po' di tempo, perché i simboli di debug vengono caricati nella cache. Oltre a cercare simboli e file binari tramite il server dei simboli o il percorso di ricerca locale, a causa dell'integrazione GDBServer, è possibile che questi file vengano caricati da un file system remoto se non sono disponibili localmente. Questa operazione è in genere più lenta rispetto all'acquisizione di simboli da symsrv o da un percorso di ricerca locale.

Usare il x comando per visualizzare le funzioni disponibili in 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)

Usare il dx comando per visualizzare il messaggio di saluto della variabile locale.

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

Poiché il messaggio di saluto del parametro non è stato ancora usato quando è stato eseguito il dump, non è disponibile nel file di dump.

Usare il dx comando per esaminare i processi disponibili nel file di dump.

: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   

Per visualizzare informazioni sui thread e i moduli, fare clic sul collegamento DML generato nell'output o digitare comandi simili a questo per il dump di arresto anomalo del sistema.

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

Usare le estensioni di diagnostica ELF/CORE per visualizzare le informazioni sul file di dump

Usare le estensioni di diagnostica Linux : ELFBinComposition.dll per visualizzare le informazioni sul file di dump. Ad esempio, usare !dumpdebug per verificare che si tratta di un dump principale dell'utente ELF e visualizzare altre informazioni.

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

Usare !ntprpsinfo per visualizzare i dati NT_PRPSINFO.

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

Dump di arresto anomalo del kernel KDump

Esistono molti modi per creare un file di dump di arresto anomalo in Linux. Ad esempio, un'opzione con Ubuntu Linux è descritta in Dump di arresto anomalo del kernel.

Altre opzioni includono l'uso di kexectools per abilitare Kdump. Per altre informazioni, vedere KDump (Linux).For more information, see KDump (Linux). Se kdump è abilitato, è possibile verificare che kdump sia attivo e in esecuzione usando systemctl status kdump.

Una volta attivato l'arresto anomalo del sistema operativo in un sistema di test, viene creato il file di dump di arresto anomalo del sistema operativo.

Caricare ed esaminare il dump di arresto anomalo del sistema operativo Linux

Usare l'opzione di menu Apri file di dump per caricare il kdump generato.

Come descritto nella sezione precedente, abilitare la visualizzazione NATVIS e l'attraversamento dei collegamenti DML ottimizzato per Linux, caricando il gstl.natvis file.

Usare i comandi di composizione bin ELF per analizzare un dump del kernel Linux

Per poter usare comandi aggiuntivi di composizione bin ELF, usare il comando con estensione chain per verificare che il ELFBinComposition.dll sia caricato.

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]
...

Se ELFBinComposition non viene caricato, usare .load per caricarlo. Per altre informazioni, vedere .load, .loadby (DLL dell'estensione di caricamento)

Usare il !ELFBinComposition.dumpdebug comando per visualizzare informazioni sul file di dump caricato. In questo esempio è stato caricato un file di dump principale dell'utente ELF.

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

Usare ELFBinComposition !vmcoreinfo per visualizzare la tabella VMCOREINFO dal dump del core del kernel Linux (KDUMP) sottoposto a debug.

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
...

!kdumppagerange Usare per eseguire il dump della prima parte del file di dump, a partire da zero.

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

L'output di !kdumppagerange visualizza vari valori PFN (Page Frame). È possibile selezionare uno degli interessi e usare per !kdumppfn <PFN> visualizzare informazioni sul PFN e dove si trovano i dati all'interno del KDUMP.

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

Esaminare il file di dump

Usare il k comando per visualizzare lo stack di chiamate per esaminare il codice in esecuzione quando si è verificato l'arresto anomalo.

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

Usare il dx comando per esaminare il file dump. Ad esempio, esaminare i primi 30 processi usando questo comando.

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]
...

Fare clic sui collegamenti DML o usare comandi simili a questo per esaminare i thread su un processo di interesse.

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            
...

Sono disponibili informazioni aggiuntive per ogni thread, come illustrato di seguito.

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

Usare lo script LinuxKernel.js per analizzare un dump del kernel Linux

L'estensione del debugger LinuxKernel.js contiene un set di comandi progettati per funzionare in modo analogo a quelli presenti nell'utilità di arresto anomalo del sistema Linux usata per aprire e analizzare gli arresti anomali della modalità kernel Linux.

Per usare lo script, caricare prima di tutto lo script.

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

Per altre informazioni sull'uso del caricamento degli script, vedere Scripting del debugger JavaScript.

!file

!files Usare per visualizzare informazioni sulla struttura di file Linux nel file dump. È simile al comando dei file di arresto anomalo del sistema.

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 sintassi:

!files [<arg>]

Senza [<arg>]- Equivalente a 'file' - fornisce l'elenco dei file di processo corrente

[<arg>]:

pid - Fornisce l'elenco di file per l'ID processo specificato

64-bit num - Fornisce l'elenco di file per l'attività in corrispondenza dell'indirizzo specificato

<task struct [*]> - Fornisce l'elenco di file per lo struct attività specificato per oggetto

<process object> - Fornisce l'elenco di file per l'attività rappresentata dall'oggetto processo

!montare

!mount Usare per visualizzare informazioni sulla struttura di file Linux nel file dump.

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 sintassi:

Senza [<arg>]- Equivalente al comando 'mount' - mostra i file system montati

[<arg>]:

pid - Fornisce i file system montati per lo spazio dei nomi del processo con il pid specificato

64-bit num - Fornisce i file system montati per lo spazio dei nomi del task_struct specificato dall'indirizzo

<task struct [*]> - Fornisce i file system montati per lo spazio dei nomi del task_struct specificato

<process object> - Fornisce i file system montati per lo spazio dei nomi dell'attività rappresentata dal processo

!rete

!net Utilizzare per visualizzare l'elenco di rete di sistema.

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 sintassi:

!net [<arg>]

Senza [<arg>]- Equivalente a 'net' - fornisce l'elenco di rete di sistema

[<arg>]:

pid - Fornisce l'elenco net per lo spazio dei nomi del processo con il pid specificato

64-bit num - Fornisce l'elenco net per lo spazio dei nomi del task_struct specificato dall'indirizzo

<task struct [*]> - Fornisce l'elenco net per lo spazio dei nomi del task_struct specificato

<process object> - Fornisce l'elenco net per lo spazio dei nomi dell'attività rappresentata dal processo

!runq

!runq Usare per visualizzare informazioni sulle attività nella coda di esecuzione.

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 sintassi:

!runq

!runq non dispone di parametri di comando.

Comandi di dump del kernel aggiuntivi

!dev - Visualizza i dati del dispositivo relativi al dispositivo di tipo carattere e blocco, assegnazioni, utilizzo delle porte di I/O, utilizzo della memoria di I/O.

!log - Visualizza il contenuto del kernel log_buf.

!vm - Visualizza un riepilogo dell'utilizzo della memoria virtuale.

!timer - Visualizza le voci della coda timer.

oggetti dx command e Linux

Il comando dx può essere usato per analizzare kdumps. Visualizzare l'oggetto Sessions per visualizzare i vari oggetti figlio disponibili.

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   
...

L'oggetto kernel cursession contiene l'oggetto PrintKLog che può essere usato per visualizzare il log del kernel.

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

Questo comando dx mostra l'uso di .Contains() per cercare stringhe specifiche nel log.

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»=.

Usare .Reverse() per visualizzare gli ultimi eventi registrati.

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...

Per altre informazioni sull'uso di query LINQ con il comando dx, vedere Uso di LINQ Con gli oggetti debugger.

Estensioni di diagnostica Linux - ELFBinComposition.dll

Nella ELFBinComposition.dll sono disponibili le estensioni di diagnostica del file di dump linux seguenti.

Comandi del file di dump

Questi comandi possono essere usati nella maggior parte dei file di dump.

!dumpdebug - Visualizzare la diagnostica per il dump principale sottoposto a debug. Ciò include l'output di vari altri comandi.

!ntprstatus - Visualizzare i record NT_PRSTATUS dal dump principale di cui è in corso il debug.

!vmcoreinfo - Visualizzare la tabella VMCOREINFO dal debug del kernel core dump (KDUMP).

Comandi di dump ELF

Questi comandi possono essere usati solo in file di dump di base ELF.

!corephdrs - Visualizzare la tabella di intestazione del programma per il dump principale sottoposto a debug.

!ntprpsinfo - Visualizzare i dati NT_PRPSINFO dal dump principale di cui è in corso il debug.

!ntfile - Visualizzare i dati NT_FILE dal dump principale di cui è in corso il debug.

!ntauxv - Visualizzare i dati NT_AUXV dal dump principale di cui è in corso il debug.

Comandi del file di dump di arresto anomalo del kernel

Questi comandi possono essere usati solo nei file KDUMP (Kernel Core Dump).

!kdumpdescs - Visualizzare l'elenco di intervalli di pagine e descrittori di pagina in un KDUMP.

!kdumppagerange <n> - Visualizza informazioni sul raggruppamento n-th delle pagine nel KDUMP.

!kdumppfn <pfn> - Visualizza informazioni sul frame <pfn> di pagina e dove si trovano i dati all'interno del KDUMP.

Altri comandi di diagnostica

!cppex - Visualizza informazioni sulle eccezioni C++ correnti in anteprima (non rilevate e "just") C++ per il thread corrente, usando le strutture interne di libstdc++e i simboli NANO.

!cppfilt [-n] <mangled name> - Demangles un nome C++ mangled come se fosse stato eseguito tramite lo strumento c++filt. Per altre informazioni sullo strumento C==filtr, vedere la pagina manuale di c++filt(1) - Linux manual.

!rustdemangle <mangled name> - Demangles un nome di Rust mangled. Per altre informazioni sul mangling del nome del simbolo rust, vedere Rust Symbol Mangling - RFC 2603.

Vedi anche

Simboli e origini Linux

Debug di processi remoti live linux