Freigeben über


Linux-Absturzabbilder

In diesem Artikel wird beschrieben, wie Verschiedene Typen von Linux-Absturzabbilddateien erstellt und angezeigt werden. Das Anzeigen von Linux-Absturzabbildern erfordert WinDbg, Version 1.2402.24001.0 oder höher.

Beim Öffnen eines Linux-Kernabbilds (ohne Windows) in WinDbg sollten grundlegende Debuggerbefehle ordnungsgemäß funktionieren, aber Erweiterungen und Windows-spezifische Befehle, die auf Windows-Strukturen verweisen, funktionieren nicht.

Unterstützte Absturzabbilddateien

Linux-Kernelabbilder

Das Öffnen von komprimierten Linux Kernel-KDUMPs und das Durchführen von Post-Mortem-Debugging und -Analysen mit vollständigen privaten ZWERG-Symbolen ist im Windows-Debugger verfügbar.

WinDbg unterstützt nur komprimierte ZLIB-KDUMP-Dateien. LZO und Snappy komprimierte KDUMPs werden nicht unterstützt.

Allgemeine Informationen zu Linux KDUMPs finden Sie auf der Wikipedia-Seite von KDump (Linux) und core dump.

ELF-Kernabbilder

Im Rahmen der Unterstützung von Open Enclave kann WinDbg ELF-Kernabbilder und Binärdateien sowie ZWERGsymbole (ZWERG 5 wird nicht unterstützt) von Enklaven und Linux-Anwendungen öffnen. Weitere Informationen zu Open Enclave finden Sie unter Open Enclave Debugging.

Prozess-Dumps

Einzelne Prozessabbilder werden unterstützt. Es gibt eine Reihe von Möglichkeiten zum Sammeln eines Prozessabbilds, einschließlich des Linux Sysinternals ProcDump für Linux-Dienstprogramms . Eine weitere Möglichkeit besteht darin, den GNU Debugger - GDBServer zu verwenden, um ein Kernabbild zu generieren. Weitere Informationen zu GDBServer finden Sie unter https://en.wikipedia.org/wiki/Gdbserver. Dokumentation zum Remote-GDB-Debugging ist auf der Sourceware-Website verfügbar – Debuggen von Remoteprogrammen.

Die StL-Erweiterbarkeit (Standard Template Library) in den Windows-Debuggern wird von einer NatVis-Datei bereitgestellt, die viele Versionen der STL versteht, stl.natvis die mit Visual Studio und Windows ausgeliefert werden. Allgemeine Informationen zu NATVIS finden Sie unter Native Debugger Objects in NatVis. Die Versionen der STL, die für Linux-Komponenten (GCC oder LLDB) verwendet werden, unterscheiden sich sehr.

Um NATVIS-Visualisierung und DML-Verknüpfung zu aktivieren, die für Linux optimiert ist, entladen Sie zuerst die natvis-Standarddatei .scriptunload stl.natvis.

Laden Sie dann die Datei .scriptload.gstl.natvis Verwenden Sie scriptlist , um zu bestätigen, dass dies gstl.natvis aktiv ist.

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

Weitere Informationen zum Arbeiten mit DML finden Sie unter Anpassen der Debuggerausgabe mithilfe von DML.

Einzelprozesskernabbild der DisplayGreeting-App

In diesem Beispiel wird gezeigt, wie Sie mithilfe von gdb ein einzelnes Prozesskernabbild erstellen. Weitere Informationen zur Verwendung von GDBServer mit WinDbg und einer exemplarischen Code-Vorgehensweise finden Sie unter Debuggen von Linux-Live-Remoteprozessen. Den Beispielcode für DisplayGreeting finden Sie in der exemplarischen Vorgehensweise der C++-App.

Suchen des gewünschten Prozesses

Wir können entweder alle Prozesse in Linux mithilfe des ps -A Befehls auflisten oder die Option "-f" mit pgrep verwenden, wie wir wissen, dass wir nach der DisplayGreeting-App suchen.

$ pgrep -f DisplayGreeting
9382

In diesem Beispiel wird eine Prozess-ID von 9382 gezeigt.

An den Prozess mit gdb anfügen und ein Kernabbild generieren

Verwenden Sie gdb zum Anfügen an den Prozess.

$ gdb -p 9382

Zeigen Sie Hilfe für den generate-core-file gdb-Befehl an.

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

Generieren Sie dann an der (gdb)-Eingabeaufforderung eine Prozesskernabbilddatei mit dem Standarddateinamen.

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

Laden und Untersuchen des Linux-Prozesskernabbilds

Verwenden Sie die Menüoption "Datei öffnen" in WinDbg, um das generierte Kernabbild zu laden.

Hinzufügen der Quellcode- und Symbolpfade zur Debugger-Sitzung

Um den Quellcode und die Variablen anzuzeigen, legen Sie die Symbole und den Quellpfad fest. Allgemeine Informationen zum Festlegen des Symbolpfads finden Sie unter Verwenden von Symbolen. Ausführlichere Informationen zu Linux-Symbolen finden Sie unter Linux-Symbole und -Quellen.

Verwenden Sie .sympath, um den Symbolpfad zur Debugger-Sitzung hinzuzufügen. In diesem WSL Linux Ubuntu-Beispiel sind der DisplayGreetings-Code und die Symbole für einen Benutzer namens Bob verfügbar.

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

In WSL ist dieses Verzeichnis dem Speicherort des Windows-Betriebssystems zugeordnet: C:\Users\Bob\ Daher werden diese beiden Befehle verwendet.

.sympath C:\Users\Bob\

.srcpath C:\Users\Bob\

Weitere Informationen zum Zugriff auf das WSL-Dateisystem in Windows finden Sie unter Dateiberechtigungen für WSL.

Um von zusätzlichen Linux-Betriebssystemsymbolen zu profitieren, fügen Sie die DebugInfoD-Symbole mithilfe des SYMPATH-Speicherorts hinzu.

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

Verwenden Sie den .reload Befehl, um die Symbole neu zu laden.

Unterstützt wird auch der automatische Download von Quellen von DebugInfoD-Servern, die das Zurückgeben dieses Artefakttyps unterstützen. Um diese Funktion nutzen zu können, fügen Sie den Elfutils-Server mit .srcpath hinzu.

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

Untersuchen des Prozessabbilds

Verwenden Sie den lm Befehl, um zu bestätigen, dass die Dumpdatei die DisplayGreeting-App enthält.

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

Beachten Sie, dass die erste Befehlsausführung einige Zeit in Anspruch nehmen kann, da Debugsymbole in den Cache geladen werden. Neben der Suche nach Symbolen und Binärdateien über den Symbolserver oder ihren lokalen Suchpfad kann aufgrund der GDBServer-Integration diese Dateien aus einem Remotedateisystem geladen werden, wenn sie nicht lokal gefunden werden können. Dieser Vorgang ist in der Regel langsamer als das Abrufen von Symbolen aus symsrv oder einem lokalen Suchpfad.

Verwenden Sie den x Befehl, um die in DisplayGreeting verfügbaren Funktionen anzuzeigen.

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)

Verwenden Sie den dx Befehl, um die lokale Variablengrüße anzuzeigen.

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

Da die Parametergrüße noch nicht verwendet wurden, als das Dump übernommen wurde, ist sie in der Speicherabbilddatei nicht verfügbar.

Verwenden Sie den dx Befehl, um die Prozesse zu untersuchen, die in der Speicherabbilddatei verfügbar sind.

: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   

Wenn Sie Informationen zu den Threads und Modulen anzeigen möchten, klicken Sie in der Ausgabe auf den generierten DML-Link, oder geben Sie Befehle ein, die diesem für Ihr Absturzabbild ähnlich sind.

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

Verwenden der ELF/CORE-Diagnoseerweiterungen zum Anzeigen von Speicherabbilddateiinformationen

Verwenden Sie die Linux-Diagnoseerweiterungen – ELFBinComposition.dll , um Speicherabbilddateiinformationen anzuzeigen. Verwenden Sie !dumpdebug beispielsweise die Bestätigung, dass es sich um ein ELF-Benutzerkernabbild handelt, und zeigen Sie weitere Informationen an.

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

Wird !ntprpsinfo verwendet, um die NT_PRPSINFO Daten anzuzeigen.

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

Es gibt viele Möglichkeiten, eine Absturzabbilddatei in Linux zu erstellen. Eine Option mit Ubuntu Linux wird beispielsweise im Kernel-Absturzabbild beschrieben.

Weitere Optionen sind die Verwendung von kexectools zum Aktivieren von Kdump. Weitere Informationen finden Sie unter KDump (Linux).For more information, see KDump (Linux). Wenn kdump aktiviert ist, können Sie überprüfen, ob kdump aktiv und ausgeführt systemctl status kdumpwird.

Sobald der Betriebssystemabsturz auf einem Testsystem ausgelöst wurde, wird die Absturzabbilddatei erstellt.

Laden und Untersuchen des Absturzabbilds des Linux-Betriebssystems

Verwenden Sie die Menüoption "Datei öffnen ", um den generierten Kdump zu laden.

Wie im vorherigen Abschnitt beschrieben, aktivieren Sie die NATVIS-Visualisierung und DML-Verknüpfung, die für Linux optimiert ist, indem Sie die gstl.natvis Datei laden.

Verwenden der ELF Bin-Kompositionsbefehle zum Analysieren eines Linux-Kernelabbilds

Um zusätzliche ELF Bin-Kompositionsbefehle verwenden zu können, verwenden Sie den .chain-Befehl , um zu bestätigen, dass die ELFBinComposition.dll geladen wird.

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

Wenn ELFBinComposition nicht geladen wird, verwenden Sie .load, um sie zu laden. Weitere Informationen finden Sie unter .load, .loadby (Load Extension DLL)

Verwenden Sie den !ELFBinComposition.dumpdebug Befehl, um Informationen zur geladenen Speicherabbilddatei anzuzeigen. In diesem Beispiel wurde eine ELF-Benutzerkernabbilddatei geladen.

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

Verwenden Sie ELFBinComposition !vmcoreinfo , um die VMCOREINFO-Tabelle aus dem zu debuggenden Linux-Kernelkernabbild (KDUMP) anzuzeigen.

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

Verwenden Sie die !kdumppagerange Datei, um den ersten Teil der Speicherabbilddatei abbilden zu können, beginnend bei 0.

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

Die Ausgabe von !kdumppagerange zeigt verschiedene PFN-Werte (Page Frame) an. Wir können eines von Interesse auswählen und die !kdumppfn <PFN> Informationen über den PFN anzeigen und wo sich seine Daten im KDUMP befinden.

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

Untersuchen der Speicherabbilddatei

Verwenden Sie den k Befehl, um den Aufrufstapel anzuzeigen, um zu untersuchen, welcher Code beim Absturz ausgeführt wurde.

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

Verwenden Sie den dx Befehl, um die Dumpdatei zu untersuchen. Sehen Sie sich beispielsweise die ersten 30 Prozesse mit diesem Befehl an.

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

Klicken Sie auf die DML-Links, oder verwenden Sie Befehle, die diesem ähnlich sind, um Threads in einem interessanten Prozess zu betrachten.

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

Weitere Informationen für jeden Thread sind verfügbar, wie unten dargestellt.

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

Verwenden des skripts LinuxKernel.js zum Analysieren eines Linux-Kernelabbilds

Die LinuxKernel.js Debuggererweiterung enthält eine Reihe von Befehlen, die so konzipiert sind, dass sie ähnlich wie im Linux-Absturzprogramm funktionieren, das zum Öffnen und Analysieren von Linux-Kernelmodusabstürzen verwendet wird.

Um das Skript zu verwenden, laden Sie zuerst das Skript.

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

Weitere Informationen zum Laden von Skripts finden Sie unter JavaScript Debugger Scripting.

!Dateien

Verwenden Sie die !files Informationen zur Linux-Dateistruktur in der Speicherabbilddatei. Der Befehl "Absturzdateien" ähnelt dem Befehl "Absturzdateien".

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

Without [<arg>]- Equivalent to 'files' - gives current process file list

[<arg>]:

pid - Gibt die Dateiliste für die angegebene Prozess-ID an.

64-bit num - Gibt die Dateiliste für die Aufgabe an der angegebenen Adresse an.

<task struct [*]> - Gibt der Dateiliste für die angegebene Vorgangsstruktur nach Objekt

<process object> - Gibt der Dateiliste für die Aufgabe, die durch das Prozessobjekt dargestellt wird.

!montieren

Verwenden Sie die !mount Informationen zur Linux-Dateistruktur in der Speicherabbilddatei.

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:

Without [<arg>]- Equivalent to 'mount' command - shows mounted file systems

[<arg>]:

pid - Gibt den bereitgestellten Dateisystemen den Namespace des Prozesses mit der angegebenen pid

64-bit num - Gibt den bereitgestellten Dateisystemen den Namespace der task_struct an, die von der Adresse angegeben werden.

<task struct [*]> - Gibt den bereitgestellten Dateisystemen für den Namespace der angegebenen task_struct

<process object> - Gibt den bereitgestellten Dateisystemen für den Namespace der Aufgabe, die durch den Prozess dargestellt wird.

!netto

Verwenden Sie zum !net Anzeigen der Systemnetzwerkliste.

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

Ohne [<arg>]- Äquivalent zu "net" – gibt systemnetzwerkliste

[<arg>]:

pid - Gibt die Net-Liste für den Namespace des Prozesses mit der angegebenen pid

64-bit num - Gibt die Netzliste für den Namespace der task_struct nach Adresse angegeben.

<task struct [*]> - Gibt die Netzliste für den Namespace der angegebenen task_struct

<process object> - Gibt der Nettoliste für den Namespace der Aufgabe, die durch den Prozess dargestellt wird.

!runq

Verwenden Sie die !runq Funktion zum Anzeigen von Informationen zu den Aufgaben in der Ausführungswarteschlange.

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 verfügt nicht über Befehlsparameter.

Zusätzliche Kernelabbildbefehle

!dev – Zeigt Gerätedaten zur Zeichen- und Blockierung von Geräten, Zuordnungen, E/A-Portverwendung, E/A-Speicherauslastung an.

!log - Zeigt den Kernel log_buf Inhalt an.

!vm – Zeigt eine Zusammenfassung der Nutzung des virtuellen Speichers an.

!timer – Zeigt die Zeitgeberwarteschlangeneinträge an.

dx-Befehl und Linux-Objekte

Der Dx-Befehl kann zum Untersuchen von Kdumps verwendet werden. Zeigt das Sessions-Objekt an, um die verschiedenen untergeordneten Objekte anzuzeigen, die verfügbar sind.

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

Das Cursession Kernel -Objekt enthält das PrintKLog -Objekt, das zum Anzeigen des Kernelprotokolls verwendet werden kann.

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

Dieser Dx-Befehl zeigt die Verwendung, .Contains() um nach bestimmten Zeichenfolgen im Protokoll zu suchen.

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

Wird verwendet .Reverse() , um die letzten protokollierten Ereignisse anzuzeigen.

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

Weitere Informationen zur Verwendung von LINQ-Abfragen mit dem DX-Befehl finden Sie unter Verwenden von LINQ With the debugger objects.

Linux-Diagnoseerweiterungen – ELFBinComposition.dll

Die folgenden Diagnoseerweiterungen für Linux-Dumpdateien sind im ELFBinComposition.dll verfügbar.

Dateiabbildbefehle

Diese Befehle können für die meisten Dumpdateien verwendet werden.

!dumpdebug – Zeigt die Diagnose für das zu debuggende Kernabbild an. Dazu gehört auch die Ausgabe verschiedener anderer Befehle.

!ntprstatus – Zeigt die NT_PRSTATUS Datensätze aus dem zu debuggenden Kernabbild an.

!vmcoreinfo - Zeigt die VMCOREINFO-Tabelle aus dem kernel core dump (KDUMP) an, das gedebuggt wird.

ELF-Dumpbefehle

Diese Befehle können nur für ELF-Kernabbilddateien verwendet werden.

!corephdrs – Zeigt die Programmkopftabelle für das zu debuggende Kernabbild an.

!ntprpsinfo – Zeigt die NT_PRPSINFO Daten aus dem zu debuggenden Kernabbild an.

!ntfile – Zeigt die NT_FILE Daten aus dem zu debuggenden Kernabbild an.

!ntauxv – Zeigt die NT_AUXV Daten aus dem zu debuggenden Kernabbild an.

Kernelabbilddateibefehle

Diese Befehle können nur für Kernelkernabbilddateien (Kernel Core Dump, KDUMP) verwendet werden.

!kdumpdescs - Zeigt die Liste der Seitenbereiche und Seitenbeschreibungen in einem KDUMP an.

!kdumppagerange <n> – Zeigt Informationen über die n-th-Gruppierung von Seiten im KDUMP an.

!kdumppfn <pfn> – Zeigt Informationen zum Seitenrahmen <pfn> an und wo sich seine Daten im KDUMP befinden.

Andere Diagnosebefehle

!cppex - Zeigt Informationen zu den aktuellen In-Flight-Ausnahmen (uncaught und "just" caught) für den aktuellen Thread an, wobei libstdc++-interne Strukturen und ZWERG-Symbole verwendet werden.

!cppfilt [-n] <mangled name> - Demangles ein C++-mangled-Name, als ob er über das C++filt-Tool ausgeführt wurde. Weitere Informationen zum C==filtr-Tool finden Sie unter c++filt(1) – Manuelle Linux-Seite.

!rustdemangle <mangled name> - Demangles ein rostfreier Name. Weitere Informationen zum Rostsymbolnamen mangling finden Sie unter Rust Symbol Mangling – RFC 2603.

Siehe auch

Linux-Symbole und -Quellen

Linux Live-Remote-Prozess-Debugging