troushoo

[sos]!bpmd:ブレークポイント設定

WinDbg等で使用できる.NET用のデバッガエクステンションsosでブレークポイントの設定を行う!bpmdについて説明します。

今回使用するアプリ
以下のサンプルアプリ(bpmdExe.exe)をWinDbgから起動し、func()の最初でブレークポイントを設定します。

namespace bpmdExe
{
    class Mybpmd
    {
        public void func()
        {
            Console.WriteLine("func");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Mybpmd mb = new Mybpmd();
            mb.func();
        }
    }
}

[準備]
!bpmdコマンドを使うにはsosが必要です。sosには、.NETのランタイムが必要です。したがって以下の手順を踏んで.NETのランタイムを読み込んだ後、sosを読み込みます。
1) sxe –c “” clrn
2) g
3) デバッガーに制御が落ちてくる
4) .loadby sos mscorwks(.NET 4以外)/.loadby sos clr(.NET 4)
この方法はsosのヘルプ(!help bpmd)の出力です。

注意点:
sos.dllのヘルプも上記の方法なのですが、上記1)のsxe -c "" clrnがうまく実行されないことあることが報告されています。(例:How to Break on the ‘Main’ function with the .NET CLR 4.0 and WinDbg)
そこで、sxe -c "" clrnの代わりにsxe ld:mscorjit(.NET 4以外)/sxe ld:clrjit.dll(.NET 4)を使用するといいと報告されています。(Why isn’t the !bpmd in sos / windbg not working?)
以下は、その際の手順になります。
1) sxe ld:mscorjit(.NET 4以外)/sxe ld:clrjit.dll(.NET 4)
2) g
3) デバッガーに制御が移る
4) .loadby sos mscorwks(.NET 4以外)/.loadby sos clr(.NET 4)

[!bpmd]
!bpmdコマンドは以下です。
!bpmd <モジュールネーム> <メソッド名>
したがって、今回func()でブレークポイントを張るには以下のコマンドを実行します。
!bpmd bpmdExe.exe bpmd.Mybpmd.func

その後"g"を実行すると、funcでブレークしていることがわかります。

補足
・ソースがないような場合にメソッド名を調べるには.NET Reflector, JustDecompile, ILSpy, dotPeekといった逆コンパイラを使うことができます。
以下は、いちばん有名な.NET Reflectorによる画面です。

リンク
・MSDNによる!bpmd含むsos.dllの説明
http://msdn.microsoft.com/en-us/library/bb190764.aspx


  1. 2012/02/05(日) 15:25:37|
  2. SOS・Psscor2/Psscor4
  3. | トラックバック:0
  4. | コメント:0
<<[Psscor2/Psscor4]!PrintDateTime | ホーム | IISマネージャー/appcmdでリアルタイムな情報収集 (RSCA)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/31-3575107a
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (22)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する