Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln beskrivs hur du skapar och visar olika typer av Linux-kraschdumpfiler. För att visa Linux-kraschdumpar krävs WinDbg version 1.2402.24001.0 eller senare.
När du öppnar en Linux-kärndump (icke-Windows) i WinDbg bör alla grundläggande felsökningskommandon fungera korrekt, men tillägg och Windows-specifika kommandon som refererar till Windows-strukturer fungerar inte.
Kraschdumpfiler stöds
Kärndumpar för Linux
Du kan öppna komprimerade KDUMPs för Linux-kärnan och utföra felsökning och efterföljande analys med fullständiga privata DWARF-symboler i Windows Debugger.
WinDbg stöder endast ZLIB-komprimerade KDUMP-filer. LZO- och Snappy-komprimerade KDUMP:er stöds inte.
Allmän information om Linux-KDUMP:er finns på sidan KDump (Linux) Wikipedia och Core Dump.
ELF-kärndumpningar
Som en del av stödet för Open Enclave kan WinDbg öppna ELF-kärndumpar och binärfiler samt DVÄRG-symboler (DWARF 5 stöds inte) från både enklaver och Linux-program. Mer information om Öppna enklaver finns i Felsökning av öppna enklaver.
Processdumpar
Enskilda processdumpar stöds. Det finns ett antal sätt att samla in en processdump, inklusive verktyget Sysinternals ProcDump för Linux. Ett annat alternativ är att använda GNU Debugger – GDBServer, för att generera en kärndump. Mer information om GDBServer finns i https://en.wikipedia.org/wiki/Gdbserver. Dokumentation för gdb-fjärrfelsökning finns på webbplatsen Sourceware – Felsökning av fjärrprogram.
Aktivera LINUX NATVIS-visualisering och DML-länkbläddering
StL-utökningsbarheten (Standard Template Library) i Windows-felsökarna tillhandahålls av en NatVis-fil som stl.natvis förstår många versioner av den STL som levereras med Visual Studio och Windows. Allmän information om NATVIS finns i Interna felsökningsobjekt i NatVis. Versionerna av STL som används för Linux-komponenter (GCC:er eller LLDB) skiljer sig mycket åt.
Om du vill aktivera NATVIS-visualisering och DML-länkbläddering som optimerats för Linux tar du först bort natvis-standardfilen , .scriptunloadstl.natvis.
Sedan .scriptload den gstl.natvis-filen. Använd .scriptlist för att bekräfta att det gstl.natvis är aktivt.
0: kd> .scriptlist
Command Loaded Scripts:
...
NatVis script from 'C:\Users\Bob\AppData\Local\dbg\UI\2402.24001.0\amd64\Visualizers\gstl.natvis'
Mer information om hur du arbetar med DML finns i Anpassa felsökningsprogramutdata med DML.
Kärndump av enskild process för DisplayGreeting-applikationen
Det här exemplet visar hur du skapar en enda processkärndump med gdb. Mer information om hur du använder GDBServer med WinDbg och en kodgenomgång finns i Felsökning av fjärrprocess i Linux live. Exempelkoden för DisplayGreeting finns i genomgång av C++-appar.
Leta upp önskad process
Vi kan antingen lista alla processer i Linux med hjälp av ps -A kommandot eller använda alternativet -f med pgrep, eftersom vi vet att vi letar efter Appen DisplayGreeting.
$ pgrep -f DisplayGreeting
9382
I den här exempelgenomgången visas ett process-ID på 9382.
Koppla till process med gdb och generera en kärndump
Använd gdb för att koppla till processen.
$ gdb -p 9382
Visa hjälp för generate-core-file gdb-kommandot.
(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>'.
I kommandotolken (gdb) genererar du sedan en processkärndumpningsfil med standardfilnamnet.
(gdb) generate-core-file
Saved corefile core.9382
(gdb) quit
Läsa in och undersöka Linux-processkärndumpningen
Använd menyalternativet Öppna dumpfil i WinDbg för att läsa in den genererade kärndumpen.
Lägg till käll- och symbolsökvägarna i felsökningssessionen
Om du vill visa källkoden och variablerna anger du symbolerna och källsökvägen. Allmän information om hur du anger symbolsökvägen finns i Använda symboler. Mer detaljerad information om Linux-symboler finns i Linux-symboler och -källor.
Använd .sympath för att lägga till symbolsökvägen i felsökningssessionen. I det här WSL Linux Ubuntu-exemplet är DisplayGreetings-koden och symbolerna tillgängliga på den här platsen för en användare med namnet Bob.
\\wsl$\Ubuntu\mnt\c\Users\Bob\
I WSL mappar den här katalogen till Platsen för Windows-operativsystemet: C:\Users\Bob\ Så dessa två kommandon används.
.sympath C:\Users\Bob\
.srcpath C:\Users\Bob\
Mer information om hur du kommer åt WSL-filsystemet i Windows finns i Filbehörigheter för WSL.
Om du vill dra nytta av ytterligare Linux OS-symboler lägger du till DebugInfoD-symbolerna med hjälp av .sympath-platsen.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
Använd .reload-kommandot för att läsa in symbolerna igen.
Det stöds också automatisk nedladdning av källor från DebugInfoD-servrar, som har stöd för att returnera den artefakttypen. Om du vill dra nytta av den här funktionen lägger du till elfutils-servern med hjälp av .srcpath.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
Undersöka processdumpen
lm Använd kommandot för att bekräfta att dumpfilen innehåller Appen 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
Observera att den första kommandokörningen kan ta lite tid eftersom felsökningssymboler läses in i cacheminnet. Förutom att söka efter symboler och binärfiler via symbolservern eller din lokala sökväg kan den på grund av GDBServer-integreringen läsa in dessa filer från ett fjärrfilsystem om de inte kan hittas lokalt. Den här åtgärden är vanligtvis långsammare än att hämta symboler från symsrv eller en lokal sökväg.
x Använd kommandot för att visa de funktioner som är tillgängliga i 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)
dx Använd kommandot för att visa den lokala variabelhälsningen.
0:000> dx greeting
...
Error: Unable to bind name 'greeting'
Eftersom parameterhälsningen ännu inte användes när dumpen togs är den inte tillgänglig i dumpfilen.
dx Använd kommandot för att undersöka de processer som är tillgängliga i dumpfilen.
: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
Om du vill visa information om trådar och moduler klickar du på den genererade DML-länken i utdata eller skriver in kommandon som liknar den här för kraschdumpningen.
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
Använd ELF/CORE-diagnostiktilläggen för att visa dumpfilinformation
Använd Linux-diagnostiktilläggen – ELFBinComposition.dll för att visa dumpfilinformation. Använd till exempel !dumpdebug för att bekräfta att det här är en ELF-användarkärndump och visa annan information.
0:000> !dumpdebug
Dump Diagnostics: Format = ELF User Core
********************************************************************************
File Mapping Size: 0x151d78 (1 Mb)
Highest Memory Offset: 0x14e5f0 (1 Mb)
...
Använd !ntprpsinfo för att visa NT_PRPSINFO data.
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
Kernel KDump kraschnedladdningar
Det finns många sätt att skapa en kraschdumpfil i Linux. Ett alternativ med Ubuntu Linux beskrivs till exempel i Kernel Crash Dump.
Andra alternativ är användningen av kexectools för att aktivera Kdump. Mer information finns i KDump (Linux). Om kdump är aktiverat kan du kontrollera med systemctl status kdump att kdump är aktivt och körs.
När os-kraschen utlöses i ett testsystem skapas kraschdumpfilen.
Läsa in och undersöka kraschdumpningen i Linux-operativsystemet
Använd menyalternativet Öppna dumpfil för att läsa in den genererade kdumpen.
Som beskrivs i föregående avsnitt aktiverar du NATVIS-visualisering och DML-länkbläddering optimerad för Linux genom att läsa in gstl.natvis filen.
Använda ELF Bin-kompositionskommandon för att analysera en Linux-kerneldumpning
Om du vill kunna använda ytterligare ELF Bin-kompositionskommandon använder du kommandot .chain för att bekräfta att ELFBinComposition.dll har lästs in.
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]
...
Om ELFBinComposition inte läses in använder du .load för att läsa in den. Mer information finns i .load, .loadby (Load Extension DLL)
!ELFBinComposition.dumpdebug Använd kommandot för att visa information om den inlästa dumpfilen. I det här exemplet har en ELF-dumpfil för användarkärnor lästs in.
0: kd> !ELFBinComposition.dumpdebug
Dump Diagnostics: Format = Kernel KDump
********************************************************************************
File Mapping Size: 0x3b34090 (59 Mb)
Highest Memory Offset: 0x3b34090 (59 Mb)
Använd ELFBinComposition !vmcoreinfo för att visa VMCOREINFO-tabellen från linux kernel core dump (KDUMP) som debuggas.
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 Använd för att dumpa den första delen av dumpfilen, med början vid noll.
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
Utdata från !kdumppagerange visar olika sidramsvärden (PFN). Vi kan välja ett av intresse och använda !kdumppfn <PFN> för att visa information om PFN och var dess data finns i KDUMP.
0: kd> !kdumppfn 0x540e0
Page frame 0x540e0 = File offset [0x307430, 0x307b9f) 0x76f bytes as ZLIB...
Granska dumpfilen
k Använd kommandot för att visa anropsstacken för att undersöka vilken kod som kördes när kraschen inträffade.
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
dx Använd kommandot för att undersöka dumpfilen. Titta till exempel på de första 30 processerna med det här kommandot.
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]
...
Klicka på DML-länkarna eller använd kommandon som liknar den här för att titta på trådar i en intresseprocess.
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
...
Ytterligare information för varje tråd finns tillgänglig, enligt nedan.
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
Använda LinuxKernel.js-skriptet för att analysera en Linux-kerneldumpning
Felsökningstillägget LinuxKernel.js innehåller en uppsättning kommandon som är utformade för att fungera på samma sätt som de i Linux-kraschverktyget, vilket används för att öppna och analysera krascher i Linux-kernelläge.
Om du vill använda skriptet läser du först in skriptet.
0: kd> .scriptload LinuxKernel.js
JavaScript script successfully loaded from 'C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\LinuxKernel.js'
Mer information om hur du arbetar med att läsa in skript finns i Skript för JavaScript-felsökningsprogram.
!filer
!files Använd för att visa information om Linux-filstrukturen i dumpfilen. Det är liknande kommandot för kraschfiler.
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 syntax:
!files [<arg>]
Utan [<arg>]– motsvarande "filer" – ger aktuell processfillista
[<arg>]:
pid – Ger fillistan för det angivna process-ID:t
64-bit num – Ger en lista över filer för uppgiften på den angivna adressen
<task struct [*]> – Ger fillistan för den angivna uppgiftsstrukturen per objekt
<process object> – Ger fillistan för uppgiften som representeras av processobjektet
!mount
!mount Använd för att visa information om Linux-filstrukturen i dumpfilen.
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 syntax:
Utan [<arg>]– motsvarar kommandot "montering" – visar monterade filsystem
[<arg>]:
pid – Ger de monterade filsystemen för namnområdet för processen med angiven pid
64-bit num – Ger de monterade filsystemen för namnområdet för task_struct som anges av adressen
<task struct [*]> – Visar de monterade filsystemen för namnområdet för den angivna task_struct
<process object> – Ger de monterade filsystemen för namnområdet för uppgiften som representeras av processen
!nät
Använd !net för att visa listan över systemnätverk.
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 syntax:
!net [<arg>]
Without [<arg>]– motsvarande "net" – ger systemnätverkslista
[<arg>]:
pid – Ger nettolistan för namnrymden för processen med angiven pid
64-bit num - Ger nettolistan för namnområdet för task_struct som anges av adressen
<task struct [*]> – Ger nettolistan för namnområdet för den angivna task_struct
<process object> – Ger nätverkslistan för namnområdet för det uppdrag som representeras av processen
!runq
!runq Använd för att visa information om aktiviteterna i körningskö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 syntax:
!runq
!runq har inga kommandoparametrar.
Ytterligare kerneldumpkommandon
!dev – Visar enhetsdata angående tecken- och blockenheter, tilldelningar, användning av I/O-portar och användning av I/O-minne.
!log – Visar innehållet i kerneln log_buf.
!vm – Visar en sammanfattning av användning av virtuellt minne.
!timer – Visar poster i timerkön.
dx-kommando och Linux-objekt
DX-kommandot kan användas för att undersöka kdumps. Visa sessions-objektet och se de olika underordnade objekten som är tillgängliga.
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
...
Objektet cursession Kernel innehåller PrintKLog-objektet som kan användas för att visa kernelloggen.
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
Det här dx-kommandot visar användningen av .Contains() för att söka efter specifika strängar i loggen.
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»=.
Använd .Reverse() för att visa de senaste händelserna som loggats.
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...
Mer information om hur du använder LINQ-frågor med dx-kommandot finns i Använda LINQ med felsökningsobjekten.
Linux-diagnostiktillägg – ELFBinComposition.dll
Följande fildiagnostiktillägg för Linux-dumpfiler är tillgängliga i ELFBinComposition.dll.
Dumpfilkommandon
Dessa kommandon kan användas på de flesta dumpfiler.
!dumpdebug – Visa diagnostik för kärndumpen som debuggas. Detta inkluderar utdata från olika andra kommandon.
!ntprstatus – Visa NT_PRSTATUS poster från kärndumpen som debuggas.
!vmcoreinfo – Visa VMCOREINFO-tabellen från kernelkärndumpningen (KDUMP) som debuggas.
ELF-dumpkommandon
Dessa kommandon kan bara användas på en ELF-kärndumpningsfil.
!corephdrs – Visa programhuvudtabellen för kärndumpen som debuggas.
!ntprpsinfo – Visa NT_PRPSINFO data från kärndumpen som debuggas.
!ntfile – Visa NT_FILE-data från kärndumpen som debuggas.
!ntauxv – Visa NT_AUXV data från kärndumpen som debuggas.
Kommandon för kernelkraschdumpfiler
Dessa kommandon kan endast användas på KDUMP-filer (Kernel Core Dump).
!kdumpdescs – Visa listan över sidintervall och sidbeskrivningar i en KDUMP.
!kdumppagerange <n> – Visa information om den n:e grupperingen av sidor i KDUMP.
!kdumppfn <pfn> – Visa information om sidramen <pfn> och var dess data finns i KDUMP.
Andra diagnostikkommandon
!cppex – Visar information om de aktuella undantagen under flygning (obefångade och "bara" fångade) C++ för den aktuella tråden med hjälp av libstdc++:s interna strukturer och DWARF-symboler.
!cppfilt [-n] <mangled name> - Demanglerar ett C++-manglat namn som om det hade körts genom verktyget c++filt. Mer information om C==filtr-verktyget finns i c++filt(1) – manuell Linux-sida.
!rustdemangle <mangled name> - Demangles ett Rustmanglat namn. Mer information om rostsymbolens namnmangling finns i Rust Symbol Mangling - RFC 2603.