次の方法で共有


Windows Azure の記事を書きました

こんにちは d99 です。
実は私は Windows Azure のサポートチームにも所属していたりするのですが、その関係で Windows Azure に関連して記事を書きました。

Windows Azure サポートの現場から > リモート デスクトップを利用したデバッグ (その 2)
https://msdn.microsoft.com/ja-jp/windowsazure/jj219279

もしよろしければご賞味ください :-) 内容としては Azure 特有のハナシではありません。むしろ普通の Web アプリケーションで有用かなと思います。上記の記事では OutputDebugString() API を紹介しています。

他にそういったデバッグで使い易い API 関数と言えば、DebugBreak() API でしょうか。この関数は、要はアタッチしているデバッガを止めるというもので、以前ご紹介した windbg.exe などのデバッガで任意のタイミングでブレークさせる、というものです。DebugBreak() API のプラットフォーム呼び出し定義は以下のようになります。

[DllImport("kernel32.dll")]
static extern void DebugBreak();

さて、これに対応したマネージドメソッドはないのでしょうか? 実は System.Diagnostics.Debugger.Break() メソッドがそれに当たるのですが、これが NET Framework 2.0 と 4.0 で動きが少し異なります。.NET Framework 2.0 の Debugger.Break() は、Visual Studio しか止まりません。しかし、.NET Framework 4.0 の Debugger.Break() は結果的に DebugBreak() API を呼び出しますのでネイティブデバッガでも止まります。

まとめると、windbg.exe 等のネイティブデバッガで止めたいなら、.NET Framework 2.0 なら DebugBreak() API をプラットフォーム呼び出し。.NET Framework 4.0 なら System.Diagnostics.Debugger.Break() マネージドメソッド、という事になります。私の同僚には、未だにデバッグブレークといえばなんとかして int 3 を直接書こうとするものもいますがw、4.0 であれば Debugger.Break() を使って頂ければと思います。

また、OutputDebugString() API も、System.Diagnostics.Debug.Print() だけでなく、System.Diagnostics.Debugger.Log()  もあります。引数が多いので Windows Azure の記事では紹介しませんでしたが、こちらもデバッガ上にログを出力しますし、Debug.Print() と違ってデバッグビルドかどうかに関わらずログを出力します(デバッガー自体の設定には依存します)。

基本的にはマネージドメソッドを使いつつ、うまく Windows API で補完すると素敵なデバッグライフをお送り頂けるのではないかと :-)

ではまた。
d99 でした。