.NET向けWinDBGコマンド

もくじ
https://tera1707.com/entry/2022/02/06/144447

ダンプ関連記事

https://tera1707.com/entry/2022/02/06/144447#WindowsDump

やりたいこと

.NETアプリをWinDBGデバッグしたい。

だいぶ昔から、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