Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek popisuje, jak vytvořit a zobrazit různé typy souborů se záznamem pádu systému Linux. Zobrazení chybových výpisů systému Linux vyžaduje verzi WinDbg 1.2402.24001.0 nebo vyšší.
Při otevření výpisu jádra Systému Linux (jiné než Windows) v systému WinDbg by měly všechny příkazy základního ladicího programu správně fungovat, ale rozšíření a příkazy specifické pro Windows, které odkazují na struktury Systému Windows, nebudou fungovat.
Podporované soubory výpisu stavu systému
Výpisy paměti jádra Linuxu
Otevření komprimovaných KDUMPů linuxového jádra a provádění postmortem ladění a analýzy s úplnými privátními DWARF symboly je k dispozici v ladicím programu pro Windows.
WinDbg podporuje pouze komprimované soubory KDUMP z knihovny ZLIB. LZO a Snappy komprimované KDUMPy nejsou podporovány.
Obecné informace o linuxovém KDumpu najdete na stránce Wikipedie KDump (Linux) a Core dump.
Výpisy paměti jádra ve formátu ELF
Jako součást podpory Open Enclave může WinDbg otevřít ELF core výpisy a binární soubory a také symboly DWARF (DWARF 5 není podporován) z enkláv i Linuxových aplikací. Další informace o funkci Open Enclave naleznete v tématu Ladění Open Enclave.
Výpisy stavu procesu
Podporují se výpisy paměti jednoho procesu. Existuje řada způsobů, jak shromáždit výpis procesu, včetně Linux Sysinternals ProcDump pro Linux utility. Další možností je použít GNU Debugger - GDBServer k vygenerování výpisu jádra. Další informace o GDBServer naleznete v tématu https://en.wikipedia.org/wiki/Gdbserver. Dokumentace ke vzdálenému ladění gdb je k dispozici na webu zdrojového softwaru – Ladění vzdálených programů.
Povolení vizualizace NATVIS v Linuxu a procházení odkazů DML
Rozšiřitelnost standardní knihovny šablon (STL) v ladicících programech Windows je poskytována souborem NatVis, stl.natvis který rozumí mnoha verzím STL, které jsou dodávány se sadou Visual Studio a Windows. Obecné informace o nástroji NATVIS naleznete v tématu Nativní objekty ladicího programu v NatVis. Verze STL, které se používají pro komponenty Linuxu (GCC nebo LLDB), se velmi liší.
Pokud chcete povolit vizualizaci NATVIS a procházení odkazů DML optimalizované pro Linux, nejprve rozbalte výchozí soubor natvis .scriptunloadstl.natvis.
Pak spusťte soubor gstl.natvis. Pomocí souboru .scriptlist potvrďte, že gstl.natvis je aktivní.
0: kd> .scriptlist
Command Loaded Scripts:
...
NatVis script from 'C:\Users\Bob\AppData\Local\dbg\UI\2402.24001.0\amd64\Visualizers\gstl.natvis'
Další informace o práci s DML naleznete v tématu Přizpůsobení výstupu ladicího programu pomocí DML.
Jádrový výpis jednoho procesu aplikace DisplayGreeting
Tento příklad ukazuje, jak vytvořit jeden výpis paměti jádra procesu pomocí gdb. Další informace o použití GDBServer s WinDbg a návod kódu naleznete v tématu Ladění vzdáleného procesu v reálném Linuxu. Příklad kódu pro DisplayGreeting najdete v návodu k aplikaci jazyka C++.
Vyhledání požadovaného procesu
Pomocí příkazu můžeme buď vypsat všechny procesy v Linuxu ps -A , nebo použít možnost -f s příkazem pgrep, protože víme, že hledáme aplikaci DisplayGreeting.
$ pgrep -f DisplayGreeting
9382
V tomto návodu se ukazuje ID procesu 9382.
Připojit k procesu pomocí gdb a vytvořit výpis paměti jádra
K připojení k procesu použijte gdb.
$ gdb -p 9382
Zobrazit nápovědu pro příkaz 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>'.
Pak na výzvě GDB vygenerujte soubor výpisu paměti procesu s výchozím názvem souboru.
(gdb) generate-core-file
Saved corefile core.9382
(gdb) quit
Načíst a prozkoumat výpis paměti procesu Linuxu
Pomocí možnosti Otevřít soubor s výpisem paměti v WinDbg načtěte vygenerovaný výpis paměti jádra.
Přidejte cesty ke zdroji a symbolům do relace ladicího programu
Pokud chcete zobrazit zdrojový kód a proměnné, nastavte symboly a cestu ke zdroji. Obecné informace o nastavení cesty symbolů naleznete v tématu Použití symbolů. Podrobnější informace o symbolech Linuxu najdete v tématu Symboly a zdroje Linuxu.
Použijte .sympath k přidání cesty symbolu do relace ladicího programu. V tomto příkladu WSL Linux Ubuntu jsou kód a symboly DisplayGreetings k dispozici na tomto místě pro uživatele jménem Bob.
\\wsl$\Ubuntu\mnt\c\Users\Bob\
Ve WSL se tento adresář mapuje na umístění operačního systému Windows: C:\Users\Bob\ Proto se použijí tyto dva příkazy.
.sympath C:\Users\Bob\
.srcpath C:\Users\Bob\
Další informace o přístupu k systému souborů WSL ve Windows naleznete v tématu Oprávnění k souborům pro WSL.
Pokud chcete využívat další symboly operačního systému Linux, přidejte symboly DebugInfoD pomocí umístění .sympath.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
Použijte příkaz .reload k znovu načtení symbolů.
Podporuje se také automatické stahování zdrojů ze serverů DebugInfoD, které podporují vrácení tohoto typu artefaktu. Pokud chcete tuto funkci využít, přidejte server elfutils pomocí cesty .srcpath.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
Zkoumání výpisu stavu procesu
Pomocí příkazu lm potvrďte, že soubor s výpisem dat obsahuje aplikaci 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
Všimněte si, že první spuštění příkazu může nějakou dobu trvat, protože symboly ladění se načtou do mezipaměti. Kromě hledání symbolů a binárních souborů prostřednictvím serveru symbolů nebo místní cesty hledání může kvůli integraci GDBServer tyto soubory načíst ze vzdáleného systému souborů, pokud se nedají najít místně. Tato operace je obvykle pomalejší než získání symbolů ze symsrv nebo místní vyhledávací cesty.
x Pomocí příkazu zobrazte funkce dostupné v 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)
Příkazem dx zobrazte místní proměnnou greeting.
0:000> dx greeting
...
Error: Unable to bind name 'greeting'
Vzhledem k tomu, že parametr 'greeting' nebyl při výpisu ještě použit, není v souboru s výpisem k dispozici.
Pomocí příkazu dx zkontrolujte procesy, které jsou k dispozici v souboru s výpisem.
: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
Pokud chcete zobrazit informace o vláknech a modulech, klikněte ve výstupu na vygenerovaný odkaz DML nebo zadejte příkazy podobné tomuto pro výpis stavu systému.
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
Použijte diagnostická rozšíření ELF/CORE k zobrazení informací o souboru s výpisem paměti.
K zobrazení informací o datovém dumpu použijte rozšíření diagnostiky - Linuxu ELFBinComposition.dll. Použijte například !dumpdebug k potvrzení, že se jedná o výpis uživatelského jádra ELF, a k zobrazení dalších informací.
0:000> !dumpdebug
Dump Diagnostics: Format = ELF User Core
********************************************************************************
File Mapping Size: 0x151d78 (1 Mb)
Highest Memory Offset: 0x14e5f0 (1 Mb)
...
Slouží !ntprpsinfo k zobrazení NT_PRPSINFO dat.
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
Výpisy paměti při havárii KDump jádra
Existuje mnoho způsobů, jak vytvořit soubor s výpisem stavu systému v Linuxu. Například jedna možnost s Ubuntu Linuxem je popsaná v výpisu stavu jádra.
Mezi další možnosti patří použití kexectools pro povolení Kdump. Další informace najdete v tématu KDump (Linux). Pokud je povolen kdump, můžete ověřit, zda je kdump aktivní a spuštěn pomocí systemctl status kdump.
Po aktivaci chybového ukončení operačního systému v testovacím systému se vytvoří soubor s výpisem stavu systému.
Načti a prozkoumej výpis havárie systému Linux.
K načtení vygenerovaného souboru kdump použijte nabídku Otevřít soubor s výpisem paměti.
Jak je popsáno v předchozí části, povolte vizualizaci NATVIS a procházení odkazů DML optimalizované pro Linux načtením gstl.natvis souboru.
Analýza výpisu stavu jádra Linuxu pomocí příkazů elF Bin composition
Abyste mohli použít další příkazy složení ELF Bin, pro ověření pomocí příkazu .chain ověřte, že je načten ELFBinComposition.dll.
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]
...
Pokud není ELFBinComposition načtena, použijte .load k jejímu načtení. Další informace naleznete v tématu .load, .loadby (Load Extension DLL)
Použijte příkaz !ELFBinComposition.dumpdebug k zobrazení informací o načteném souboru s výpisem paměti. V tomto příkladu byl načten soubor s výpisem paměti jádra uživatele ELF.
0: kd> !ELFBinComposition.dumpdebug
Dump Diagnostics: Format = Kernel KDump
********************************************************************************
File Mapping Size: 0x3b34090 (59 Mb)
Highest Memory Offset: 0x3b34090 (59 Mb)
Pomocí ELFBinComposition !vmcoreinfo zobrazte tabulku VMCOREINFO z paměťového výpisu jádra Linuxu (KDUMP), který je právě laděn.
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
...
Použijte !kdumppagerange k výpisu první části výpisového souboru počínaje od nuly.
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
Výstup !kdumppagerange zobrazuje různé hodnoty rámce stránky (PFN). Můžeme vybrat jeden, který nás zajímá, a použít !kdumppfn <PFN> k zobrazení informací o PFN a kde se nachází jeho data v rámci KDUMP.
0: kd> !kdumppfn 0x540e0
Page frame 0x540e0 = File offset [0x307430, 0x307b9f) 0x76f bytes as ZLIB...
Prozkoumat soubor s výpisem paměti
k Pomocí příkazu zobrazte zásobník volání a prozkoumejte, jaký kód se spustil, když došlo k chybě.
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
Pomocí příkazu dx prozkoumejte soubor s výpisem paměti. Podívejte se například na prvních 30 procesů pomocí tohoto příkazu.
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]
...
Klikněte na odkazy DML nebo použijte příkazy podobné těmto, abyste viděli vlákna ve vámi zvoleném procesu.
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
...
Další informace pro každé vlákno jsou k dispozici, jak je znázorněno níže.
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
Použití skriptu LinuxKernel.js k analýze výpisu paměti jádra Linuxu
Rozšíření ladicího programu LinuxKernel.js obsahuje sadu příkazů navržených tak, aby fungovaly podobně jako v linuxovém nástroji pro chybové ukončení, které slouží k otevření a analýze chybových ukončení linuxového režimu jádra.
Pokud chcete skript použít, nejprve ho načtěte.
0: kd> .scriptload LinuxKernel.js
JavaScript script successfully loaded from 'C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\LinuxKernel.js'
Další informace o práci se skripty načítání naleznete v tématu JavaScript Debugger Scripting.
!soubory
!files Slouží k zobrazení informací o struktuře souborů Linuxu v souboru s výpisem paměti. Podobá se příkazu pro soubory při havárii.
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 syntaxe:
!files [<arg>]
Bez [<arg>]– ekvivalent k souborům – poskytuje seznam souborů aktuálního procesu.
[<arg>]:
pid - Poskytne seznam souborů pro dané ID procesu.
64-bit num - Poskytuje seznam souborů pro úkol na dané adrese.
<task struct [*]> - Poskytuje seznam souborů pro danou strukturu úkolu podle objektu.
<process object> - Poskytuje seznam souborů pro úkol reprezentovaný objektem procesu.
!připojit
!mount Slouží k zobrazení informací o struktuře souborů Linuxu v souboru s výpisem paměti.
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 syntaxe:
Bez [<arg>]– ekvivalent příkazu mount – zobrazuje připojené systémy souborů.
[<arg>]:
pid - Zobrazuje připojené systémy souborů pro prostor názvů procesu s daným PID
64-bit num - Poskytuje připojené systémy souborů pro obor názvů task_struct dané adresou.
<task struct [*]> - Poskytuje připojené souborové systémy pro jmenný prostor daného task_struct
<process object> - Poskytuje systémy souborů připojené do jmenného prostoru úlohy reprezentované procesem.
!síť
!net Umožňuje zobrazit seznam systémových sítí.
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 syntaxe:
!net [<arg>]
Bez [<arg>]– ekvivalent k síti – poskytuje seznam sítí systému.
[<arg>]:
pid - Poskytuje seznam sítí pro obor názvů procesu s daným PID
64-bit num - Poskytuje čistý seznam pro obor názvů task_struct zadaný adresou.
<task struct [*]> - Poskytuje seznam sítí pro obor názvů daného task_struct
<process object> - Poskytuje síťový seznam pro obor názvů úlohy, kterou zastupuje proces.
!runq
Použijte !runq k zobrazení informací o úlohách ve frontě spuště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 syntaxe:
!runq
!runq nemá žádné parametry příkazu.
Další příkazy výpisu stavu jádra
!dev - Zobrazí data zařízení týkající se znakových a blokových zařízení, přiřazení, využití vstupně-výstupních portů a využití vstupně-výstupní paměti.
!log – Zobrazí obsah log_buf jádra.
!vm – Zobrazí souhrn využití virtuální paměti.
!timer – Zobrazí položky fronty časovače.
dx – příkazy a linuxové objekty
Příkaz dx lze použít k prošetření kdumps. Zobrazte objekt Sezení, pro zobrazení různých podřízených objektů, které máte k dispozici.
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
...
Objekt jádra cursession obsahuje objekt PrintKLog, který lze použít k zobrazení záznamu 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
Tento příkaz dx ukazuje použití .Contains() k vyhledání konkrétních řetězců v protokolu.
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»=.
Slouží .Reverse() k zobrazení posledních událostí protokolovaných.
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...
Další informace o použití dotazů LINQ s příkazem dx naleznete v tématu Použití LINQ s objekty ladicího programu.
Rozšíření diagnostiky Linuxu – ELFBinComposition.dll
Následující diagnostické rozšíření linuxových výpisových souborů jsou k dispozici v ELFBinComposition.dll.
Příkazy pro výpis souborů
Tyto příkazy lze použít u většiny souborů s výpisem paměti.
!dumpdebug – Zobrazí diagnostiku pro ladění výpisu paměti jádra. To zahrnuje výstup různých dalších příkazů.
!ntprstatus – Zobrazit záznamy NT_PRSTATUS z rozpracovaného základního výpisu.
!vmcoreinfo – Zobrazí tabulku VMCOREINFO z laděného výpisu jádra (KDUMP).
Příkazy výpisu stavu systému ELF
Tyto příkazy lze použít pouze u souborů výpisu jádra ELF.
!corephdrs – Zobrazí tabulku záhlaví programu pro laděný výpis paměti jádra.
!ntprpsinfo – Zobrazit data NT_PRPSINFO z výpisu paměti jádra.
!ntfile – Zobrazí NT_FILE data z laděného výpisu paměti jádra.
!ntauxv – Zobrazí NT_AUXV data z laděného výpisu stavu jádra.
Příkazy souboru výpisu stavu systému jádra
Tyto příkazy lze použít pouze u souborů s výpisem jádra (KDUMP).
!kdumpdescs - Zobrazí seznam rozsahů stránek a popisovačů stránek v KDUMP.
!kdumppagerange <n> - Zobrazí informace o n-té skupině stránek v KDUMP.
!kdumppfn <pfn> - Zobrazí informace o rámečku <pfn> stránky a kde jsou jeho data v KDUMP.
Další diagnostické příkazy
!cppex – Zobrazí informace o aktuálních výjimkách jazyka C++ pro aktuální vlákno (nezachycené a "jen" zachycené) pomocí vnitřních struktur knihovny libstdc++ a symbolů TRPASLÍKU.
!cppfilt [-n] <mangled name> – Rekonstruuje zkomolený název C++, jako by byl zpracován pomocí nástroje c++filt. Další informace o nástroji C==filtr naleznete na stránce c++filt(1) – ruční stránka Linuxu.
!rustdemangle <mangled name> - Dekóduje zkreslené jméno Rust. Další informace o změně názvů symbolů v Rustu naleznete v Rust Symbol Mangling - RFC 2603.
Viz také
ladění živých procesů systému Linux na dálku