共用方式為


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 的詳細資訊,請參閱 Open Enclave 除錯

處理序傾印

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

Windows 偵錯工具中的標準模板庫(STL)擴充功能是由 NatVis 檔案提供,stl.natvis 能夠理解隨附於 Visual Studio 和 Windows 的多個 STL 版本。 如需 NATVIS 的一般資訊,請參閱 NatVis 中的原生調試程序物件。 用於 Linux 元件 (GCC 或 LLDB) 的 STL 版本非常不同。

若要啟用針對 Linux 優化的 NATVIS 視覺效果和 DML 連結周遊,請先卸除預設 natvis 檔案 .scriptunloadstl.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 範例中,DisplayGreetings 程式代碼和符號可供名為 Bob 的使用者在指定位置取得。

\\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命令來檢視局部變數greeting

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,您可以使用 systemctl status kdump 來確認 kdump 是否正在執行。

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

載入並檢查 Linux OS 當機轉儲

使用 [ 開啟傾印檔案 ] 功能表來載入生成的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 程序命名空間的網路清單

64-bit num - 提供由位址指定的 task_struct 命名空間的網路清單

<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 - 顯示關於目前線程執行中的 C++ 異常(未攔截和「剛」攔截)的信息,使用 libstdc++ 的內部結構和 DWARF 符號。

!cppfilt [-n] <mangled name> - 將C++編譯後命名還原為如同經過 c++filt 工具處理一樣。 如需 C==filtr 工具的詳細資訊,請參閱 c++filt(1) — Linux 手冊頁面

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

另請參閱

Linux 符號和來源

Linux 即時遠程進程偵錯