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 で入手できます。
Linux NATVIS の視覚化と DML リンク トラバーサルを有効にする
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」を参照してください。