もくじ
https://tera1707.com/entry/2022/02/06/144447
ダンプ関連記事
https://tera1707.com/entry/2022/02/06/144447#WindowsDump
やりたいこと
だいぶ昔から、WinDBGは達人向けツール
というイメージがあり、手を出してこなかったのだが、
先日少し触る機会があったので、これを機会に少し勉強したい。
で、とりあえずコマンドを知らないと話にならないので、使えそうなコマンドをメモしておく。
今回メモしてるコマンドは「SOS.dll」のコマンドで、以前のWinDBGだと標準では使えなかったから、.NETのダンプを見るときは、SOS.dllというのを別途読み込んで使ったコマンドらしい。
現在のWinDBGでは、標準で積んでるので何もしなくてよい様子。
前提
WinDBGコマンド(マネージド向けのSOSのコマンド)
主なコマンドの公式情報は こちら。
以下には、自分が使ってみたものを挙げる。
!threads
プロセス内のすべてのマネージドスレッドを表示する。
下図のような感じで出てくるのだが、一番右の列に、そのスレッドで最後に起きた例外とそのアドレスが表示される。
一番左の「DBG」の列が、スレッド番号。
~<スレッド番号>s
デバッガが見ている現在のスレッドを、指定の番号のスレッドに切り替える。(これは、SOSのコマンドではないかも)
例えば、上の!threads
の画像の中ではスレッドの0と6と7があるが、もし6番スレッドに切り替えたい場合は、
~6s
とする。
!printexception
または !pe
現在選択しているスレッドで最後にスローされた例外を表示する。
例外で落ちたダンプを開いている場合、落ちたときの例外とそのコールスタックを表示する。
!printexception <例外アドレス>
または !pe <例外アドレス>
指定した例外発生時のコールスタックを表示する。
「例外アドレス」には、!threads
で見た、最後に起きた例外のところに出ていたアドレスを入れる。
!threadsの結果のこの部分↓
※表示時のイメージは、引数無しの!pe
と同じ。
!clrstack
マネージドコードのコールスタックを見る。
!clrstack -p
!clrstack で出したコールスタックにあるメソッドそれぞれの引数が何かを見る。
!clrstack -l
!clrstack で出したコールスタックにあるメソッドそれぞれの中のローカル変数の値を見る。
但し、デバッガーにはローカル変数名がわからないので、「ローカル変数のアドレス=値」の形で出てくる。
!clrstack -a
pとlの合わせ技。
!u <メソッドのコードアドレス>
コードアドレスで指定したメソッドの逆アセンブリを表示する。
<メソッドのコールアドレス>
は、!clrstack
で出てきた「IP」の数値を使用する。
結果、こうなる
参考
SOSコマンド
https://learn.microsoft.com/ja-jp/dotnet/framework/tools/sos-dll-sos-debugging-extension