次の方法で共有


Linux クラッシュ ダンプ

この記事では、さまざまな種類の Linux クラッシュ ダンプ ファイルを作成して表示する方法について説明します。 Linux クラッシュ ダンプを表示するには、WinDbg バージョン 1.2402.24001.0 以降が必要です。

WinDbg で Linux (Windows 以外) コア ダンプを開くと、基本的なデバッガー コマンドはすべて正常に動作しますが、Windows 構造体を参照する拡張機能と Windows 固有のコマンドは機能しません。

サポートされているクラッシュ ダンプ ファイル

Linux カーネル ダンプ

Linux カーネル圧縮 KDUMP を開き、完全なプライベート DWARF シンボルを使用して事後デバッグと分析を行うことは、Windows デバッガーで使用できます。

WinDbg では、ZLIB 圧縮 KDUMP ファイルのみがサポートされます。 LZO および Snappy 圧縮 KDUMP はサポートされていません。

Linux KDUMP に関する一般的な情報については、Wikipedia ページKDump (Linux)、および Core dump を参照してください。

ELF コア ダンプ

Open Enclave のサポートの一環として、WinDbg は、エンクレーブと Linux アプリケーションの両方から ELF コア ダンプとバイナリ、および DWARF シンボル (DWARF 5 はサポートされていません) を開くことができます。 Open Enclave の詳細については、「 エンクレーブを開くデバッグを参照してください。

プロセス ダンプ

単一プロセス ダンプがサポートされています。 Linux Sysinternals ProcDump for Linux ユーティリティなど、プロセス ダンプを収集する方法はいくつかあります。 もう 1 つのオプションは、GNU デバッガー (GDBServer) を使用してコア ダンプを生成することです。 GDBServer の詳細については、「 https://en.wikipedia.org/wiki/Gdbserver」を参照してください。 リモート gdb デバッグのドキュメントは、Sourceware Web サイトの Debugging Remote Programs で入手できます。

Windows デバッガーの標準テンプレート ライブラリ (STL) 機能拡張は、Visual Studio と Windows に付属する STL の多くのバージョンを理解 stl.natvis NatVis ファイルによって提供されます。 NATVIS の一般的な情報については、「natVis の Native Debugger Objects」を参照してください。 Linux コンポーネント (GCC または LLDB) に使用される STL のバージョンは非常に異なります。

Linux 用に最適化された NATVIS 視覚化と DML リンク トラバーサルを有効にするには、まず既定の natvis ファイル .scriptunload stl.natvisをアンロードします。

次に、gstl.natvis ファイルを.scriptloadします。 .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 を使用して 1 つのプロセス コア ダンプを作成する方法を示します。 WinDbg での GDBServer の使用とコードチュートリアルの詳細については、「 Linux ライブ リモート プロセスデバッグを参照してください。 DisplayGreeting のコード例については、 C++ アプリのチュートリアルを参照してください。

目的のプロセスを見つける

ps -A コマンドを使用して Linux のすべてのプロセスを一覧表示するか、pgrep で -f オプションを使用できます。これは、DisplayGreeting アプリを探していることを知っています。

$ pgrep -f DisplayGreeting
9382

このチュートリアルの例では、9382 のプロセス ID を示します。

gdb を使用してプロセスにアタッチし、コア ダンプを生成する

gdb を使用してプロセスにアタッチします。

$ gdb -p 9382

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

次に、(gdb) プロンプトで、既定のファイル名を含むプロセス コア ダンプ ファイルを生成します。

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

Linux プロセス コア ダンプを読み込んで調べる

WinDbg の Open dump file メニュー オプションを使用して、生成されたコア ダンプを読み込みます。

デバッガー セッションにソース パスとシンボル パスを追加する

ソース コードと変数を表示するには、シンボルとソース パスを設定します。 シンボル パスの設定に関する一般的な情報については、「 シンボルの使用」を参照してください。 Linux シンボルの詳細については、「 Linux のシンボルとソースを参照してください。

デバッガー セッションにシンボル パスを追加するために使用 .sympath します。 この WSL Linux Ubuntu の例では、Bob というユーザーの DisplayGreetings コードとシンボルをこの場所で使用できます。

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

WSL では、このディレクトリは Windows OS の場所 ( C:\Users\Bob\ ) にマップされるため、これら 2 つのコマンドが使用されます。

.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 の 1 つのオプションについては、 Kernel クラッシュ ダンプで説明されています。

その他のオプションには、kdump を有効にする kexectools の使用が含まれます。 詳細については、「 KDump (Linux)」を参照してください。 kdump が有効になっている場合は、kdump がアクティブであり、 systemctl status 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 (Load Extension 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 から始めてダンプします。

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) 値が表示されます。 目的の 1 つを選択し、 !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 - 指定されたプロセス ID のファイル一覧を指定します

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> - プロセスによって表されるタスクの名前空間のネット リストを指定します

!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 コマンドを使用して、kdump を調査できます。 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   
...

型指定カーネル オブジェクトには、カーネル ログを表示するために使用できる 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 シンボルを使用して、現在のスレッドに対する現在のインフライト (キャッチされておらず、"単に" キャッチされた) C++ 例外に関する情報を表示します。

!cppfilt [-n] <mangled name> - C++ のマングルされた名前は、c++filt ツールを介して実行されたかのようにデマングルします。 C==filtr ツールの詳細については、 c++filt(1) - Linux のマニュアル ページを参照してください。

!rustdemangle <mangled name> - Rust のマングル名をデマングルします。 rust シンボル名のマングリングの詳細については、「 Rust Symbol Mangling - RFC 2603」を参照してください。

関連項目

Linux のシンボルとソース

Linux のライブ リモート プロセス デバッグ