Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Włączanie wizualizacji NATVIS systemu Linux i przechodzenia linków DML
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.