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.
Abilitare la visualizzazione NATVIS linux e l'attraversamento dei collegamenti DML
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.