|
|
|
|
|
重要なWinDbgのコマンド |
|
2010/07/18 |
|
|
|
■自動解析 (最初に実行するコマンド) |
|
|
@ |
kd> |
!analyze -v |
stopエラー自動解析 (メモリダンプの時) |
|
|
A |
kd> |
lmvm ドライバ名 |
ドライバのタイムスタンプ |
|
|
|
|
|
|
|
|
|
ここまでは常に実施する |
|
|
■プロセスとスレッド |
|
|
kd> |
!pcr |
|
実行スレッド(CurrentThread)、IdleThread、IDT、IRQL 表示。 |
|
|
kd> |
kb |
|
現在のRUNNING thread
のスタックを表示 |
|
|
kd> |
!process 0 |
全体のアプリ、プロセス、スレッドを調査(Windows NT4.0) |
|
|
kd> |
!stacks |
全体のアプリ、プロセス、スレッドを調査(Windows 2000以降) |
|
|
0: kd> !stacks |
|
CPU0の全てのプロセスを出力。 【図1】参照 |
|
|
0: kd> ~1s |
|
CPU1に変更。 「1: kd> ~0s」はCPU0に変更。 |
|
|
1: kd> !stacks |
|
CPU1の全てのプロセスを出力。 【図1】参照 |
|
|
kd> |
!process |
実行中のプロセスのみ。 「RUNNING」のあるプロセス。 |
|
|
kd> |
!process
x |
指定プロセスの待ち行列を調べる
(上p.350)インサイド書籍 |
|
|
kd> |
!thread |
|
実行中のthreadのみ。 「RUNNING」のあるthread。 |
|
|
kd> |
!thread xxxx |
指定のthread |
|
|
|
threadのスタックは7秒以上でページアウトの可能性有り。 |
|
|
kd> |
!ethread xxxx |
Display ETHREAD structure |
|
|
kd> |
!kthread xxxx |
Display KTHREAD structure |
|
|
kd> |
!ready 1 |
レディ状態にあるスレッドを調べる(重要ではない) (上p.382) |
|
|
kd> |
!Object xxxx |
!handleの部分表示 (重要ではない) |
|
|
kd> |
!exqueue |
システム ワーカースレッド(重要ではない) |
|
|
kd> |
!handle |
ハンドル テーブル(重要ではない) |
|
|
【図1】!stacksでの表示 |
|
|
[アプリケーション1.exe] |
|
|
process x |
thread |
READY |
|
|
process x |
thread |
Blocked |
|
OSはRUNNING |
|
|
〜〜 |
〜〜 |
Blocked |
|
できるthreadを |
|
|
[アプリケーション2.exe] |
|
順番に実行する。 |
|
|
process b |
thread |
Blocked |
|
|
kbで表示するのは |
process b |
thread |
RUNNING |
|
|
最後に実行した |
〜〜 |
〜〜 |
READY |
|
Ticks: は約10mSec |
|
|
threadのスタック |
〜〜〜〜〜〜〜〜 |
|
のカウンタで直前の |
|
|
です |
|
[アプリケーションn.exe]多数あり |
実行時間を示す。 |
|
|
process zz |
thread |
Blocked |
|
|
|
■ドライバ関連 |
|
|
kd> |
lm |
|
ドライバ リスト |
|
|
kd> |
lm kv |
|
ドライバ の版数一覧 |
|
|
kd> |
lmvm ドライバ名 |
ドライバ の日付 |
|
|
kd> |
!irpfind |
|
IRP(I/O要求パケット)待ち行列 |
|
|
kd> |
!idt |
|
IRQ(割込要求)ベクタテーブル。IRQ処理プログラムを確認。 |
|
|
kd> |
!tirmer |
|
DPC(遅延フロシージャコール)のタイマ待ち行列 |
|
|
|
ドライバ→(a)→IRP→IRQ→DPC→(a)
データ無しまで |
|
|
↑←←←←←←←←←↓ I/O処理を続ける。 |
|
|
■PCI関連 |
|
|
kd> |
!pci |
|
PCIリスト (Bus, Device,
Function) (カーネルデバッガのみ?) |
|
|
kd> |
!pcitree |
PCI接続のデバイスをツリー表示 (2000以降) |
|
|
kd> |
!arbiter |
|
システムリソース( I/O, メモリ, IRQ, DMA, )表示 (2000以降) |
|
|
■NMI と IRQ ベクタテーブル。 |
|
|
kd> |
.load kdex2x86 |
!idt などを有効にする (dllの関数を読込。下行の表記も有り) |
|
|
kd> |
!kdex2x86.idt 0 |
割込テーブル(IDT)の一覧を表示。(Windows NT/2000) |
|
|
kd> |
!idt -a |
|
割込テーブル(IDT)の一覧を表示。(Windows XP以降) |
|
|
|
■メモリ管理 |
|
|
|
kd> |
!memusage |
★memory usage 情報 「Invalid
PTE エラー」の調査。 |
|
|
kd> |
!vm |
|
★Virtual Memory
Usage 情報 |
|
|
kd> |
!sysptes |
PTE調査 |
|
|
kd> |
!lookaside |
look-aside lists |
|
|
kd> |
!poolused 2 |
|
pool (2000以降) |
|
|
kd> |
!poolused |
|
pool (Windows XP 用) |
|
|
kd> |
!Kdex2x86.xpool -map |
|
pool (NT4.0) |
|
|
kd> |
!xpoolmap |
NP pool (XP) |
|
|
kd> |
!spoolused |
NP pool (XP) |
|
|
■CPU関連 |
|
|
kd> |
!cpuinfo |
|
CPUのマイクロコードを確認 |
|
|
kd> |
!cpuid |
|
コンピューターのCPUIDを表示 |
|
|
kd> |
!sysinfo cpuinfo |
CPU情報 |
|
|
kd> |
!irql |
|
IRQLを出力。 (IRQL=00〜1F
が正解。20以上は暴走。) |
|
|
kd> |
r cr2 |
|
ページフォルトの発生したアドレス。 cr2はCPUレジスタ。 |
|
|
|
■カーネルデバッガ関連 |
|
|
kd> |
(Break) |
「Break」ボタンでプログラムを止める。 |
|
|
kd> |
.reload /f |
シンボルを再ロード(カーネルデバッガの途中で立上で使用) |
|
|
kd> |
g |
|
プログラムを再実行。 |
|
|
kd> |
eb [a] xx xx xx |
メモリアドレス[a]からデータ「xx xx
xx」を書き込む |
|
|
kd> |
.dump /m mini.dmp |
カーネルデバッガでミニダンプを取得。 |
|
|
kd> |
ba e1 xxxx |
プログラムアドレスxxxxでハードブレーク。「e1」の1は固定値。 |
|
|
kd> |
ba e1 xxxx "r;dd esp |4;g" アドレスxxxxで「" "」の条件をトレース表示。 |
|
|
kd> |
ba r4 xxxx |
メモリアドレスxxxxの4バイトreadとwriteでハードブレーク。r4
= r1/r2/r4 |
|
kd> |
ba w4 xxxx |
メモリアドレスxxxxの4バイトwriteでハードブレーク。w4
= w1/w2/w4 |
|
|
kd> |
bl |
|
ブレークのリスト表示。 |
|
|
kd> |
bc x |
|
指定番号のブレークを削除。(番号は bl で確認する) |
|
|
注意:「bp」はソフトブレーク。「ba」はハードブレークでこちらを使用の事。 |
|
「ba」はDiskに退避しメモリに存在しない場合も使用可能。 |
|
|
■その他調査 |
|
|
kd> |
s -d 80000000 L4000000 xxxxxxxx |
|
L4000000は長さで固定。 |
|
|
|
アドレス80000000〜8fffffffでxxxxxxxx
のデータ検索。 |
|
|
kd> |
!chkimg |
メモリ
コラプション(陳腐化)(memory_corruption)の調査。 |
|
|
kd> |
!chkimg -lo 50 -d !nt |
|
|
kd> |
!chkimg -lo 50 -d !win32k |
|
|
kd> |
dd xxxx |
メモリのダブルワード表示 (WinDbgでは専用ウィンドウ有り) |
|
|
kd> |
u [a] [b] |
アドレス[a]から[b]まで長い(大量)の逆アセンブルが可能。 |
|
|
kd> |
x nt!Rlp* |
指定ソフトのシンボルのリストの出力 (参考:「nt!」はOSを示す) |
|
|
kd> |
.trap xxxx-70 |
xxxxはトラップの先頭部でCPUフラグのあるアドレス。 |
|
|
|
|
CPUレジスタとトラップのプログラムを表示。 |
|
|
|
|
IRQ処理ではDS,ESは確認できない。NMIは表示可。 |
|
|
|
■コマンド一覧 (WinDbgコマンドは3種類あり) (印刷し手元に置く) |
|
|
kd> |
? |
|
(1) 通常コマンド (一覧) |
「」:コマンドの頭 |
資料印刷 |
|
|
kd> |
.help |
|
(2) メタコマンド
(一覧) |
「.」:コマンドの頭 |
資料印刷 |
|
|
kd> |
.chain |
|
(3) 拡張コマンド |
|
|
[path: C:\Program Files\Debugging Tools for Windows\winext\ext.dll] など。 |
|
|
kd> |
!ext.help |
(3) 拡張コマンド (一覧) |
「!」:コマンドの頭 |
資料印刷 |
|
|
kd> |
.hh
[command] |
コマンドの詳細説明 |
|
|
・不明なコマンドは「WinDbg」→「help」→「Contents」で検索する。 |
|
|
■参考 |
|
|
|
Ticks: |
約10mSec * n のカウンタで相対的な実行時間を示す。 |
|
|
|
TicksはRUNNINGのthreadでは実行権を受け取った時からの時間で、異常に |
|
|
|
Ticksが大きい時はIRQLが高い状態でループしている事を示す。 |
|
|
|
アプリのようにIRQL=0であれば自動的に他のthreadに実行権が移動する。 |
|
|
|
|
|
各threadのその前に実行したスレッドをメモリダンプより知ることはできない。 |
|
|
|
「!stacks」コマンドでも各threadのTicksを表示させることができ、Ticks=0 で |
|
|
|
あれば直前に実行したことが推定できる。 |
|
|
|
|
|
kb: |
|
デフォルトで20行までのスタックトレースを表示。 |
|
|
|
「.kframes xx」コマンドでこの20行(default count)を変更できる。 |
|
|
|
IRQ又はNMIが発生した時にトラップが発生するが、「.trap xxxx」コマンドで |
|
|
|
その時のCPUレジスタの内容を知ることができる。「.trap xxxx」コマンド後の |
|
|
|
「kb」コマンドはそのトラップの直前のスタックトレースに変わる。 |
|
|
|
|
|
Homeに戻る |
|
以上 |
|
|
|
|
|
|
|
|
|
|
|
|
|