troushoo

MDA (Managed Debugging Assistants)を利用したデバッグ

MDA(Managed Debugging Assistants)を利用すると、通常の方法ではわかりえないより詳細なデバッグ情報を取得することができます。
MDAにはいろいろなタイプがありますが、今回はPInvokeStackImbalance MDAを説明します。

今回利用するサンプルアプリ
Beep()を呼び出すサンプルアプリを使います。
(このコードはThottamのブログで紹介されていたコードです。)

using System.Runtime.InteropServices;
 
namespace MDA
{
    class Program
    {
        static void Main(string[] args)
        {
            Beep(3000, 1000);
        }
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool Beep(long frequency, long duration);
    }
}
上記のコードは無事コンパイルもでき実行もできるのですが、Beep音はなりません。
なぜなら、Beep()の定義はMSDNによると以下であり、
BOOL Beep(
  DWORD dwFreq, // 音の周波数
  DWORD dwDuration // 音の持続時間
);
すなわち、上記コードの赤色の部分のlongはintでなくてはいけないためです。
このように通常では気づきにくいエラーを、MDAを使って検知します。

Visual StudioでMDAを利用する方法
Visual Studioを利用すると簡単にMDAを利用することができます。
1. 上記のコードのプロジェクトを作成します。
2. デバッグ→例外 をクリックします。

3. Managed Debugging Assistantsの'+'をクリックします。

4. PInvokeStackImbalance の"スローされるとき"にチェックを入れます。

5. F5を押しデバッグを開始します。
6. 以下のような"PInvokeStackImbalanceが検出されました"というダイアログが表示されます。
このダイアログは4のPInvokeStackImbalanceを有効にしていないと現れません。

ダイアログに表示の通り、PInvokeシグネチャが一致していないことがわかります。

WinDbgでMDAを利用する方法
1. 上記のコードのEXE (ここではMDA.exe) を作成します。

2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFrameworkにREG_SZで名前:MDA、データ:1を作成します。

wow64環境ではHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFrameworkに作成する必要があります。

3. exeがあるフォルダに、<exe名>.mda.configを作成し、中身に以下の内容を記述します。

<mdaConfig>
  <assistants>
    <pInvokeStackImbalance enable="true"/>
  </assistants>
</mdaConfig>
フォルダは以下のようになります。

4. WinDbgを起動し、外套のexeを実行します。
5. MDAのメッセージが表示されます。

メッセージに表示の通り、PInvokeシグネチャが一致していないことがわかります。

補足
今回紹介したPInvokeStackImbalance MDA以外の著名なMDAとして、bindingFailure MDAcallbackOnCollectedDelegate MDA等があります。詳細はMSDNをご参照ください。

リンク
マネージ デバッグ アシスタントによるエラーの診断
http://msdn.microsoft.com/ja-jp/library/d21c150d.aspx
・Managed Debugging Assistants (MDA's)
http://blogs.msdn.com/b/thottams/archive/2006/10/20/managed-debugging-assistants-mda-s.aspx


  1. 2012/06/30(土) 14:23:04|
  2. ツール
  3. | トラックバック:0
  4. | コメント:0
<<Process Explorerで.NETアプリのスタックを確認 | ホーム | releaseビルド時にも!clrstackで詳細な情報を確認する方法>>

コメント

コメントの投稿


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

トラックバック

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

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

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

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

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