共用方式為


Linux 損毀傾印

本文說明如何建立及檢視不同類型的Linux損毀傾印檔案。 檢視 Linux 損毀傾印需要 WinDbg 1.2402.24001.0 版或更新版本。

在 WinDbg 中開啟 Linux(非 Windows) 核心傾印時,基本調試程式命令應該都能正常運作,但參考 Windows 結構的擴充功能和 Windows 特定命令將無法運作。

支援的損毀傾印檔案

Linux 核心傾印

開啟 Linux 核心壓縮的 KDUMP,並在 Windows 調試程式中使用完整的私人 DWARF 符號執行事後偵錯和分析。

WinDbg 僅支援 ZLIB 壓縮的 KDUMP 檔案。 不支援 LZO 和 Snappy 壓縮的 KDUMP。

如需 Linux KDUMP 的一般資訊,請參閱 KDump (Linux) 維琪百科頁面和 核心傾印

ELF 核心傾印

在支援 Open Enclave 的一部分,WinDbg 可以從記憶體保護區和 Linux 應用程式開啟 ELF 核心傾印和二進制檔,以及 DWARF 符號(不支援 DWARF 5)。 如需 Open Enclave 的詳細資訊,請參閱 開啟記憶體保護區偵錯

處理序傾印

支援單一進程傾印。 有許多方式可以收集進程傾印,包括Linux Sysinternals ProcDump for Linux 公用程式。 另一個選項是使用 GNU 調試程式 - GDBServer 來產生核心傾印。 如需 GDBServer 的詳細資訊,請參閱 https://en.wikipedia.org/wiki/Gdbserver。 來源軟體網站提供遠端 gdb 偵錯的檔 - 偵錯遠端程式

Windows 調試程式中的標準範本連結庫 (STL) 擴充性是由 NatVis 檔案提供, stl.natvis 可瞭解隨附於 Visual Studio 和 Windows 的許多 STL 版本。 如需 NATVIS 的一般資訊,請參閱 NatVis 中的原生調試程序物件。 用於 Linux 元件 (GCC 或 LLDB) 的 STL 版本非常不同。

若要啟用針對 Linux 優化的 NATVIS 視覺效果和 DML 連結周遊,請先卸除預設 natvis 檔案 .scriptunload stl.natvis

然後 .scriptload 檔案 gstl.natvis 。 使用 .scriptlist 確認為 gstl.natvis 使用中狀態。

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

如需使用 DML 的詳細資訊,請參閱 使用 DML 自定義除錯程序輸出。

DisplayGreeting 應用程式的單一進程核心傾印

此範例示範如何使用 gdb 建立單一進程核心傾印。 如需搭配 WinDbg 使用 GDBServer 和程式代碼逐步解說的詳細資訊,請參閱 Linux 即時遠程進程偵錯。 如需 DisplayGreeting 的範例程式代碼,請參閱 C++應用程式逐步解說

找出所需的程式

我們可以使用 ps -A 命令列出 Linux 中的所有進程,或使用 -f 選項搭配 pgrep,因為我們知道我們要尋找 DisplayGreeting 應用程式。

$ pgrep -f DisplayGreeting
9382

在此範例逐步解說中,它會顯示 9382 的進程標識碼。

使用 gdb 附加至進程併產生核心傾印

使用 gdb 附加至進程。

$ gdb -p 9382

顯示 gdb 命令的說明 generate-core-file

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

然後在 (gdb) 提示字元中,產生具有預設檔名的進程核心傾印檔案。

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

載入並檢查Linux進程核心傾印

使用 WinDbg 中的 [ 開啟傾印檔案 ] 功能表選項來載入產生的核心傾印。

將來源和符號路徑新增至調試程式會話

若要檢視原始碼和變數,請設定符號和來源路徑。 如需設定符號路徑的一般資訊,請參閱 使用符號。 如需 Linux 符號的詳細資訊,請參閱 Linux 符號和來源

使用 .sympath 將符號路徑新增至調試程式會話。 在此 WSL Linux Ubuntu 範例中,名為 Bob 的使用者可以使用 DisplayGreetings 程式代碼和符號。

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

在 WSL 中,此目錄會對應至 Windows OS 位置: C:\Users\Bob\ 因此會使用這兩個命令。

.sympath C:\Users\Bob\

.srcpath C:\Users\Bob\

如需在 Windows 中存取 WSL 文件系統的詳細資訊,請參閱 WSL 的檔案許可權。

若要受益於其他 Linux OS 符號,請使用 .sympath 位置新增 DebugInfoD 符號。

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

.reload使用 命令來重載符號。

此外,也支援從 DebugInfoD 伺服器自動下載來源,其支援傳回該成品類型。 若要利用這項功能,請使用 .srcpath 新增 elfutils 伺服器。

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

檢查進程傾印

lm使用 命令來確認傾印檔案包含 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

請注意,第一個命令執行可能需要一些時間,因為偵錯符號會載入快取中。 除了透過符號伺服器或本機搜尋路徑尋找符號和二進位檔,因為 GDBServer 整合,如果無法在本機找到這些檔案,它可能會從遠端檔案系統載入這些檔案。 這項作業通常比從 symsrv 或本機搜尋路徑取得符號慢。

x使用 命令來顯示 DisplayGreeting 中可用的函式。

0:000> x /D /f DisplayGreeting!*
 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

*** WARNING: Unable to verify timestamp for DisplayGreeting
00005651`7935b331 DisplayGreeting!_GLOBAL__sub_I__Z17GetCppConGreetingPwm (void)
00005651`7935b2db DisplayGreeting!__static_initialization_and_destruction_0 (int, int)
00005651`7935b37b DisplayGreeting!std::__array_traits<wchar_t, 50>::_S_ptr (wchar_t (*)[50])
00005651`7935b368 DisplayGreeting!std::array<wchar_t, 50>::size (std::array<wchar_t, 50> *)
00005651`7935b34a DisplayGreeting!std::array<wchar_t, 50>::data (std::array<wchar_t, 50> *)
00005651`7935b225 DisplayGreeting!main (void)
00005651`7935b1e9 DisplayGreeting!GetCppConGreeting (wchar_t *, size_t)

dx使用 命令來檢視局部變數問候語。

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

由於在擷取傾印時尚未使用參數問候語,因此無法在傾印檔案中使用。

dx使用 命令來檢查傾印檔案中可用的進程。

: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   

若要檢視線程和模組的相關信息,請按下輸出中產生的 DML 連結,或輸入類似這個命令的損毀傾印。

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

使用 ELF/CORE 診斷延伸模組來顯示傾印檔案資訊

使用 Linux 診斷延伸模組 - ELFBinComposition.dll來顯示傾印檔案資訊。 例如,使用 !dumpdebug 來確認這是 ELF 使用者核心傾印,並顯示其他資訊。

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

用來 !ntprpsinfo 顯示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

核心 KDump 損毀傾印

在 Linux 中建立損毀傾印檔案的方法有很多種。 例如,Ubuntu Linux 的其中一個選項會在核心損毀傾印說明。

其他選項包括使用 kexectools 來啟用 Kdump。 如需詳細資訊,請參閱 KDump (Linux)。 如果已啟用 kdump,您可以確認 kdump 為作用中,並使用 systemctl status kdump執行。

在測試系統上觸發OS損毀之後,就會建立損毀傾印檔案。

載入並檢查LinuxOS損毀傾印

使用 [ 開啟傾印檔案 ] 功能表選項來載入產生的 kdump。

如上一節所述,藉由載入 gstl.natvis 檔案,啟用針對Linux優化的NATVIS視覺效果和 DML 連結周遊。

使用 ELF Bin 組合命令來分析 Linux 核心傾印

若要能夠使用其他 ELF Bin 組合命令,請使用 .chain 命令來確認已載入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]
...

如果未載入 ELFBinComposition,請使用 .load 來載入它。 如需詳細資訊,請參閱 .load、 .loadby (載入延伸模組 DLL)

!ELFBinComposition.dumpdebug使用 命令來顯示已載入傾印檔案的相關信息。 在此範例中,已載入 ELF 使用者核心傾印檔案。

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

使用 ELFBinComposition !vmcoreinfo 顯示要偵錯之 Linux 核心核心傾印 (KDUMP) 的 VMCOREINFO 數據表。

0: kd> !vmcoreinfo
VMCOREINFO:
    OSRELEASE=6.5.0-25-generic
    BUILD-ID=8567ad7c7c2f78f3654f6cc90a9e1b3f9c3a4b32
    PAGESIZE=4096
    SYMBOL(init_uts_ns)=ffffded86e11b388
    OFFSET(uts_namespace.name)=0
    SYMBOL(node_online_map)=ffffded86dcceb40
    SYMBOL(swapper_pg_dir)=ffffded86d143000
    SYMBOL(_stext)=ffffded86ace0000
    SYMBOL(vmap_area_list)=ffffded86de48140
    SYMBOL(mem_section)=ffff0f2e1efe4600
    LENGTH(mem_section)=8192
...

!kdumppagerange使用 來傾印傾印檔案的第一個部分,從零開始。

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

!kdumppagerange 的輸出會顯示各種頁面框架 (PFN) 值。 我們可以選取其中一個感興趣的專案,並使用 !kdumppfn <PFN> 來顯示 PFN 的相關信息,以及其數據在 KDUMP 內的位置。

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

檢查傾印檔案

k使用 命令來顯示呼叫堆疊,以調查當機發生時正在執行的程序代碼。

6: kd> k
 # Child-SP          RetAddr               Call Site
00 ffff0000`0bc3bc90 ffff0000`085161f8     vmlinux!sysrq_handle_crash+0x24 [/usr/src/kernel/drivers/tty\sysrq.c @ 147] 
01 ffff0000`0bc3bca0 ffff0000`08516824     vmlinux!__handle_sysrq+0x88 [/usr/src/kernel/drivers/tty\sysrq.c @ 583] 
02 ffff0000`0bc3bcb0 ffff0000`08308990     vmlinux!write_sysrq_trigger+0xb4 [/usr/src/kernel/drivers/tty\sysrq.c @ 1110] 
03 ffff0000`0bc3bcf0 ffff0000`08290070     vmlinux!proc_reg_write+0x80 [/usr/src/kernel/fs/proc\inode.c @ 245] 
04 ffff0000`0bc3bd10 ffff0000`0829039c     vmlinux!__vfs_write+0x60 [/usr/src/kernel/fs\read_write.c @ 490] 
05 ffff0000`0bc3bd50 ffff0000`08290704     vmlinux!vfs_write+0xac [/usr/src/kernel/fs\read_write.c @ 550] 
06 ffff0000`0bc3be00 ffff0000`082907a4     vmlinux!ksys_write+0x74 [/usr/src/kernel/fs\read_write.c @ 599] 
07 (Inline Function) --------`--------     vmlinux!__do_sys_write+0xc [/usr/src/kernel/fs\read_write.c @ 608] 
08 (Inline Function) --------`--------     vmlinux!__se_sys_write+0xc [/usr/src/kernel/fs\read_write.c @ 608] 
09 ffff0000`0bc3be40 ffff0000`08095904     vmlinux!__arm64_sys_write+0x24 [/usr/src/kernel/fs\read_write.c @ 608] 
0a ffff0000`0bc3be90 ffff0000`080834c8     vmlinux!el0_svc_handler+0x94
0b ffff0000`0bc3beb0 00000000`00000000     vmlinux!el0_svc+0x8

dx使用 命令來檢查傾印檔案。 例如,使用此命令查看前 30 個進程。

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

按兩下 DML 連結,或使用類似此連結的命令來查看感興趣的進程線程。

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

每個線程都有其他資訊可供使用,如下所示。

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

使用LinuxKernel.js腳本來分析Linux核心傾印

LinuxKernel.js調試程式擴充功能包含一組命令,其設計目的是與Linux當機公用程式中用來開啟和分析Linux核心模式當機的命令類似。

若要使用腳本,請先載入腳本。

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

如需使用載入腳本的詳細資訊,請參閱 JavaScript 調試程式腳本。

!檔

使用 來 !files 顯示傾印檔案中 Linux 檔案結構的相關信息。 它類似於當機檔案命令。

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 語法:

!files [<arg>]

沒有 [<arg>]- 相當於 'files' - 提供目前的進程檔案清單

[<arg>]

pid - 提供指定進程識別碼的檔案清單

64-bit num - 提供位於指定位址之工作的檔案清單

<task struct [*]> - 依 物件提供指定工作結構的檔案清單

<process object> - 為行程物件所代表的工作提供檔案清單

!安裝

使用 來 !mount 顯示傾印檔案中 Linux 檔案結構的相關信息。

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 語法:

沒有 [<arg>]- 相當於 'mount' 命令 - 顯示掛接的檔案系統

[<arg>]

pid - 為具有指定 pid 的進程命名空間提供掛接的檔案系統

64-bit num - 為位址所指定之task_struct的命名空間提供掛接的文件系統

<task struct [*]> - 為指定task_struct的命名空間提供掛接的檔案系統

<process object> - 為進程所代表之工作的命名空間提供掛接的文件系統

!網

!net使用 來顯示系統網路清單。

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 語法:

!net [<arg>]

沒有 [<arg>]- 相當於 'net' - 提供系統網路清單

[<arg>]

pid - 為具有指定 pid 之進程的命名空間提供 net 清單

64-bit num - 為位址所指定task_struct的命名空間提供 net 清單

<task struct [*]> - 提供指定task_struct之命名空間的凈清單

<process object> - 為進程所代表之工作的命名空間提供 net 清單

!runq

!runq使用 來顯示執行佇列上工作的相關信息。

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 語法:

!runq

!runq 沒有任何命令參數。

其他核心傾印命令

!dev - 顯示有關字元和封鎖裝置、指派、I/O 埠使用量、I/O 記憶體使用量的裝置數據。

!log - 顯示核心log_buf內容。

!vm - 顯示虛擬記憶體使用量的摘要。

!timer - 顯示定時器佇列專案。

dx 命令和Linux物件

dx 命令可用來調查 kdumps。 顯示 Sessions 物件,以查看可用的各種子物件。

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

Cursession Kernel 物件包含 PrintKLog 物件,可用來檢視核心記錄。

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

這個 dx 命令會顯示在記錄檔中尋找特定字串的用法 .Contains()

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

用來 .Reverse() 顯示記錄的最後一個事件。

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

如需搭配 dx 命令使用 LINQ 查詢的詳細資訊,請參閱 搭配調試程式物件使用 LINQ。

Linux 診斷擴充功能 - ELFBinComposition.dll

ELFBinComposition.dll提供下列 Linux 傾印檔案診斷延伸模組。

傾印檔案命令

這些命令可用於大部分的傾印檔案。

!dumpdebug - 顯示要偵錯之核心傾印的診斷。 這包括各種其他命令的輸出。

!ntprstatus - 顯示要偵錯的核心傾印NT_PRSTATUS記錄。

!vmcoreinfo - 從要偵錯的核心核心傾印 (KDUMP) 顯示 VMCOREINFO 數據表。

ELF 傾印命令

這些命令只能在 ELF 核心傾印檔案上使用。

!corephdrs - 顯示要偵錯之核心傾印的程式標頭數據表。

!ntprpsinfo - 顯示要偵錯的核心傾印NT_PRPSINFO數據。

!ntfile - 顯示要偵錯的核心傾印NT_FILE數據。

!ntauxv - 顯示要偵錯的核心傾印NT_AUXV數據。

核心損毀傾印檔案命令

這些命令只能在核心核心傾印 (KDUMP) 檔案上使用。

!kdumpdescs - 在 KDUMP 中顯示頁面範圍和頁面描述項的清單。

!kdumppagerange <n> - 顯示 KDUMP 中第 n 個頁面群組的相關信息。

!kdumppfn <pfn> - 顯示頁面框架 <pfn> 及其數據在 KDUMP 內的位置相關信息。

其他診斷命令

!cppex - 使用 libstdc++的內部結構和 DWARF 符號,顯示目前線程目前內部結構的相關信息(未攔截和「just」攔截)C++例外狀況。

!cppfilt [-n] <mangled name> - 將C++整頓的名稱解構為透過 c++filt 工具執行一樣。 如需 C==filtr 工具的詳細資訊,請參閱 c++filt(1) — Linux 手冊頁面

!rustdemangle <mangled name> - 解開 Rust 的整頓名稱。 如需 Rust 符號名稱管理的詳細資訊,請參閱 Rust 符號管理 - RFC 2603

另請參閱

Linux 符號和來源

Linux 即時遠程進程偵錯