Udostępnij przez


Zrzuty awaryjne systemu Linux

W tym artykule opisano sposób tworzenia i wyświetlania różnych typów plików zrzutu awaryjnego systemu Linux. Wyświetlanie zrzutów awaryjnych systemu Linux wymaga systemu WinDbg w wersji 1.2402.24001.0 lub nowszej.

Podczas otwierania podstawowego zrzutu systemu Linux (innego niż Windows) w systemie WinDbg podstawowe polecenia debugera powinny działać prawidłowo, ale rozszerzenia i polecenia specyficzne dla systemu Windows odwołujące się do struktur systemu Windows nie będą działać.

Obsługiwane pliki zrzutu awaryjnego

Zrzuty jądra systemu Linux

Otwieranie skompresowanych KDUMPs jądra systemu Linux oraz przeprowadzanie analizy i debugowania pośmiertnego z pełnymi prywatnymi symbolami DWARF jest możliwe w debugerze systemu Windows.

WinDbg obsługuje tylko skompresowane pliki KDUMP ZLIB. Skompresowane KDUMP-y w LZO i Snappy nie są obsługiwane.

Aby uzyskać ogólne informacje na temat KDUMPów systemu Linux, zobacz stronę Wikipedii KDump (Linux) i zrzut jądra.

Zrzuty rdzeni ELF

W ramach obsługi Open Enclave, WinDbg może otwierać zrzuty pamięci i pliki binarne ELF, a także symbole DWARF (DWARF 5 nie jest obsługiwane) zarówno z enklaw, jak i aplikacji Linux. Aby uzyskać więcej informacji na temat Open Enclave, zobacz debugowanie Open Enclave.

Zrzuty procesów

Zrzuty pojedynczego procesu są obsługiwane. Istnieje wiele sposobów zbierania zrzutu procesu, w tym narzędzie Sysinternals ProcDump for Linux dla systemu Linux. Inną opcją jest użycie debugera GNU — GDBServer w celu wygenerowania podstawowego zrzutu. Aby uzyskać więcej informacji na temat serwera GDBServer, zobacz https://en.wikipedia.org/wiki/Gdbserver. Dokumentacja zdalnego debugowania bazy danych gdb jest dostępna w witrynie internetowej Sourceware — Debugowanie programów zdalnych.

Rozszerzalność standardowej biblioteki szablonów (STL) w debugerach systemu Windows jest dostarczana przez plik NatVis, stl.natvis który rozumie wiele wersji biblioteki STL dostarczanych z programem Visual Studio i systemem Windows. Aby uzyskać ogólne informacje na temat translatora adresów sieciowych, zobacz Native Debugger Objects in NatVis (Natywne obiekty debugera w usłudze NatVis). Wersje biblioteki STL używane dla składników systemu Linux (GCC lub LLDB) są bardzo różne.

Aby móc włączyć wizualizację NATVIS i przechodzenie linków DML zoptymalizowane pod kątem systemu Linux, najpierw wyładuj domyślny plik natvis, .scriptunloadstl.natvis.

Następnie plik .scriptloadgstl.natvis. Użyj .scriptlist , aby potwierdzić, że gstl.natvis jest aktywny.

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

Aby uzyskać więcej informacji na temat pracy z językiem DML, zobacz Dostosowywanie danych wyjściowych debugera przy użyciu języka DML.

Zrzut rdzenia pojedynczego procesu aplikacji DisplayGreeting

W tym przykładzie pokazano, jak utworzyć pojedynczy zrzut rdzenia procesu przy użyciu bazy danych gdb. Aby uzyskać więcej informacji na temat używania GDBServer z WinDbg oraz omówienia kodu, zobacz zdalne debugowanie procesu na żywo w systemie Linux. Przykładowy kod funkcji DisplayGreeting można znaleźć w przewodniku po aplikacji języka C++.

Lokalizowanie żądanego procesu

Możemy wyświetlić listę wszystkich procesów w systemie Linux przy użyciu ps -A polecenia lub użyć opcji -f z narzędziem pgrep, ponieważ wiemy, że szukamy aplikacji DisplayGreeting.

$ pgrep -f DisplayGreeting
9382

W tym przykładzie krok po kroku przedstawiono identyfikator procesu 9382.

Dołączanie do procesu za pomocą bazy danych gdb i generowanie zrzutu rdzenia

Użyj bazy danych gdb, aby dołączyć do procesu.

$ gdb -p 9382

Wyświetl pomoc dla polecenia generate-core-file gdb.

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

Następnie w wierszu polecenia (gdb) wygeneruj plik zrzutu rdzenia procesu z domyślną nazwą pliku.

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

Załaduj i przeanalizuj zrzut rdzenia procesu systemu Linux

Użyj opcji menu Otwórz plik zrzutu w systemie WinDbg, aby załadować wygenerowany zrzut rdzenia.

Dodawanie ścieżek źródłowych i symboli do sesji debugera

Aby wyświetlić kod źródłowy i zmienne, ustaw symbole i ścieżkę źródłową. Aby uzyskać ogólne informacje na temat ustawiania ścieżki symboli, zobacz Używanie symboli. Aby uzyskać bardziej szczegółowe informacje na temat symboli systemu Linux, zobacz Symbole i źródła systemu Linux.

Użyj .sympath, aby dodać ścieżkę symboli do sesji debugera. W tym przykładzie WSL Linux Ubuntu kod DisplayGreetings i symbole są dostępne w tej lokalizacji dla użytkownika o nazwie Bob.

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

W programie WSL ten katalog jest mapowane na lokalizację systemu operacyjnego Windows: C:\Users\Bob\ Dlatego te dwa polecenia są używane.

.sympath C:\Users\Bob\

.srcpath C:\Users\Bob\

Aby uzyskać więcej informacji na temat uzyskiwania dostępu do systemu plików WSL w systemie Windows, zobacz Uprawnienia do plików dla programu WSL.

Aby skorzystać z dodatkowych symboli systemu operacyjnego Linux, dodaj symbole DebugInfoD przy użyciu lokalizacji .sympath.

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

Użyj polecenia , .reload aby ponownie załadować symbole.

Obsługiwane jest również automatyczne pobieranie źródeł z serwerów DebugInfoD, które obsługują zwracanie tego typu artefaktu. Aby skorzystać z tej możliwości, dodaj serwer elfutils przy użyciu pliku srcpath.

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

Badanie zrzutu procesu

lm Użyj polecenia , aby potwierdzić, że plik zrzutu zawiera aplikację 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

Należy pamiętać, że pierwsze wykonanie polecenia może zająć trochę czasu, ponieważ symbole debugowania są ładowane do pamięci podręcznej. Oprócz wyszukiwania symboli i plików binarnych za pośrednictwem serwera symboli lub lokalnej ścieżki wyszukiwania, ze względu na integrację GDBServer może załadować te pliki ze zdalnego systemu plików, jeśli nie można ich znaleźć lokalnie. Ta operacja jest zwykle wolniejsza niż uzyskiwanie symboli z symsrv lub lokalnej ścieżki wyszukiwania.

x Użyj polecenia , aby wyświetlić funkcje dostępne w funkcji 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)

Użyj polecenia , dx aby wyświetlić powitanie zmiennej lokalnej.

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

Ponieważ parametr powitanie nie został jeszcze użyty w momencie wykonywania zrzutu, nie jest dostępny w pliku zrzutu.

dx Użyj polecenia , aby sprawdzić procesy, które są dostępne w pliku zrzutu.

: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   

Aby wyświetlić informacje o wątkach i modułach, kliknij wygenerowany link DML w danych wyjściowych lub wpisz polecenia podobne do tego dla zrzutu awaryjnego.

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

Wyświetlanie informacji o pliku zrzutu za pomocą rozszerzeń diagnostycznych ELF/CORE

Użyj rozszerzeń diagnostycznych systemu Linux (ELFBinComposition.dll) aby wyświetlić informacje o pliku zrzutu. Na przykład użyj !dumpdebug, aby potwierdzić, że jest to zrzut pamięci rdzenia użytkownika ELF i wyświetlić dodatkowe informacje.

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

Służy !ntprpsinfo do wyświetlania danych 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

Zrzuty awaryjne jądra KDump

Istnieje wiele sposobów tworzenia pliku zrzutu awaryjnego w systemie Linux. Na przykład, jedna z opcji w systemie Ubuntu Linux jest opisana jako Zrzut awaryjny jądra.

Inne opcje to użycie narzędzia kexectools do aktywacji Kdump. Aby uzyskać więcej informacji, zobacz KDump (Linux). Jeśli kdump jest włączony, możesz sprawdzić, czy kdump jest aktywny i uruchomiony przy użyciu polecenia systemctl status kdump.

Po wyzwoleniu awarii systemu operacyjnego w systemie testowym zostanie utworzony plik zrzutu awaryjnego.

Załaduj i zbadaj zrzut awarii systemu operacyjnego Linux

Użyj opcji menu Otwórz plik zrzutu , aby załadować wygenerowany kdump.

Zgodnie z opisem w poprzedniej sekcji, włącz wizualizację NATVIS oraz przechodzenie przez linki DML zoptymalizowane dla systemu Linux, poprzez załadowanie pliku gstl.natvis.

Używanie poleceń kompozycji BIN ELF do analizowania zrzutu jądra systemu Linux

Aby móc używać dodatkowych poleceń kompozycji BIN ELF, upewnij się, że ELFBinComposition.dll jest załadowany, używając polecenia .chain.

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

Jeśli plik ELFBinComposition nie został załadowany, użyj pliku .load, aby go załadować. Aby uzyskać więcej informacji , zobacz .load, .loadby (Load Extension DLL)

Użyj polecenia , !ELFBinComposition.dumpdebug aby wyświetlić informacje o załadowanym pliku zrzutu. W tym przykładzie załadowano plik zrzutu pamięci użytkownika ELF.

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

Użyj elementu ELFBinComposition !vmcoreinfo , aby wyświetlić tabelę VMCOREINFO z debugowanego zrzutu rdzenia jądra systemu Linux (KDUMP).

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

Użyj polecenia , !kdumppagerange aby zrzucić pierwszą część pliku zrzutu, zaczynając od zera.

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

Dane wyjściowe polecenia !kdumppagerange wyświetlają różne wartości ramek strony (PFN). Możemy wybrać jeden z interesujących elementów i użyć polecenia !kdumppfn <PFN>, aby wyświetlić informacje o PFN i miejscu jego danych w KDUMP.

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

Sprawdzanie pliku zrzutu

Użyj polecenia , k aby wyświetlić stos wywołań, aby zbadać, jaki kod był uruchamiany po wystąpieniu awarii.

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

Użyj polecenia dx, aby zbadać plik zrzutu. Na przykład przyjrzyj się pierwszym 30 procesom przy użyciu tego polecenia.

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

Kliknij linki DML lub użyj poleceń podobnych do tego, aby przyjrzeć się wątkom dotyczącym procesu, który cię interesuje.

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

Dodatkowe informacje dotyczące każdego wątku są dostępne, jak pokazano poniżej.

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

Analizowanie zrzutu jądra systemu Linux za pomocą skryptu LinuxKernel.js

Rozszerzenie debugera LinuxKernel.js zawiera zestaw poleceń przeznaczonych do działania podobnie jak w narzędziu awaryjnym systemu Linux używanym do otwierania i analizowania awarii trybu jądra systemu Linux.

Aby użyć skryptu, najpierw załaduj skrypt.

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

Aby uzyskać więcej informacji na temat pracy ze skryptami ładowania, zobacz JavaScript Debugger Scripting (Skrypty debugera języka JavaScript).

!Pliki

Użyj polecenia , !files aby wyświetlić informacje o strukturze plików systemu Linux w pliku zrzutu. Jest on podobny do polecenia plików awarii.

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 składnia:

!files [<arg>]

Bez [<arg>]— odpowiednik "plików" — udostępnia bieżącą listę plików procesu

[<arg>]:

pid — Podaje listę plików dla danego identyfikatora procesu

64-bit num - Podaje listę plików dla zadania pod podanym adresem

<task struct [*]> — Nadaje listę plików dla danej struktury zadań według obiektu

<process object> — Nadaje listę plików dla zadania reprezentowanego przez obiekt procesu

!mount

Użyj polecenia , !mount aby wyświetlić informacje o strukturze plików systemu Linux w pliku zrzutu.

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 składnia:

Bez [<arg>]— odpowiednik polecenia "mount" — pokazuje zainstalowane systemy plików

[<arg>]:

pid - Podaje zamontowane systemy plików dla przestrzeni nazw procesu o podanym pid

64-bit num - Wyświetla zamontowane systemy plików dla przestrzeni nazw struktury zadania według adresu

<task struct [*]> — Udostępnia zamontowane systemy plików w przestrzeni nazw podanej struktury zadań

<process object> — Udostępnia zainstalowane systemy plików dla przestrzeni nazw zadania reprezentowanego przez proces

!sieć

Użyj polecenia , !net aby wyświetlić listę sieci systemu.

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 składnia:

!net [<arg>]

Bez [<arg>]— pełni rolę podobną do "net" — zapewnia listę sieci systemu

[<arg>]:

pid - Podaje listę sieci dla przestrzeni nazw procesu z danym pid

64-bit num — Podaje listę sieciową dla przestrzeni nazw task_struct wskazanej przez adres

<task struct [*]> — Podaje listę sieci dla przestrzeni nazw danego task_struct

<process object> — Podaje listę sieci dla przestrzeni nazw zadania reprezentowanego przez proces

!runq

Użyj !runq aby wyświetlić informacje o zadaniach w kolejce uruchamiania.

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 składnia:

!runq

!runq nie ma żadnych parametrów polecenia.

Dodatkowe polecenia zrzutu jądra

!dev — Wyświetla dane urządzenia dotyczące znaku i urządzenia blokowego, przypisań, użycia portów we/wy, użycia pamięci we/wy.

!log — Wyświetla zawartość log_buf jądra.

!vm — Przedstawia podsumowanie użycia pamięci wirtualnej.

!timer — Wyświetla wpisy kolejki czasomierza.

polecenia dx i obiekty systemu Linux

Komenda dx może służyć do analizowania kdumps. Wyświetl obiekt Sessions, aby wyświetlić różne dostępne obiekty podrzędne.

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

Obiekt cursession Kernel zawiera obiekt PrintKLog, który może służyć do wyświetlania dziennika jądra.

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

To polecenie dx pokazuje użycie .Contains() do wyszukiwania określonych ciągów w dzienniku.

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

Użyj .Reverse() polecenia , aby wyświetlić ostatnie zarejestrowane zdarzenia.

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

Aby uzyskać więcej informacji na temat używania zapytań LINQ za pomocą polecenia dx, zobacz Using LINQ With the debugger objects (Używanie linQ z obiektami debugera).

Rozszerzenia diagnostyczne systemu Linux — ELFBinComposition.dll

Następujące rozszerzenia diagnostyczne plików zrzutu systemu Linux są dostępne w ELFBinComposition.dll.

Polecenia dla pliku zrzutu

Te polecenia mogą być używane w większości plików zrzutu.

!dumpdebug — Wyświetl diagnostykę debugowanego zrzutu podstawowego. Obejmuje to dane wyjściowe z różnych poleceń.

!ntprstatus — Wyświetl rekordy NT_PRSTATUS z debugowanego podstawowego zrzutu.

!vmcoreinfo — Wyświetl tabelę VMCOREINFO z debugowanego zrzutu pamięci jądra (KDUMP).

Polecenia zrzutu ELF

Te polecenia mogą być używane tylko w plikach zrzutu podstawowego ELF.

!corephdrs — Wyświetl tabelę nagłówków programu dla zrzutu rdzeniowego będącego w trakcie debugowania.

!ntprpsinfo — Wyświetl dane NT_PRPSINFO z debugowanego zrzutu pamięci.

!ntfile — Wyświetlanie danych NT_FILE z zrzutu pamięci głównej, który jest debugowany.

!ntauxv — Wyświetlanie danych NT_AUXV z debugowanego podstawowego zrzutu.

Polecenia pliku zrzutu awaryjnego jądra

Te komendy mogą być używane tylko w plikach zrzutu awaryjnego jądra (KDUMP).

!kdumpdescs — Wyświetlanie listy zakresów stron i deskryptorów stron w KDUMP.

!kdumppagerange <n> - Wyświetlanie informacji o n-tej grupie stron w KDUMP.

!kdumppfn <pfn> — Wyświetla informacje o ramce <pfn> strony i miejscu, w którym znajduje się jego dane w KDUMP.

Inne polecenia diagnostyczne

!cppex - Wyświetla informacje o bieżących w locie (nieobsłużonych i 'właśnie' przechwyconych) wyjątkach w C++ dla bieżącego wątku, używając struktur wewnętrznych libstdc++ oraz symboli DWARF.

!cppfilt [-n] <mangled name> - Przetwarza zniekształcone nazwy w języku C++ tak, jakby były przekształcane za pomocą narzędzia c++filt. Aby uzyskać więcej informacji na temat narzędzia C==filtr, zobacz stronę podręcznika c++filt(1) — Linux.

!rustdemangle <mangled name> - Demangluje zniekształconą nazwę w języku Rust. Aby uzyskać więcej informacji na temat mangling nazwy symbolu rdzy, zobacz Rust Symbol Mangling - RFC 2603.

Zobacz także

symbole i źródła systemu Linux

debugowanie procesów zdalnych systemu Linux