高度なデバッグ

プログラミング MS VISUAL C#2005 言語編 (マイクロソフト公式解説書)を読んだわけですが。
やはり一番面白いのは、第13章 高度なデバッグですね(・∀・)


WinDbgとSon of Strikeデバッガ拡張(SOS.dll)を用いてInside .NET Frameworkしていくわけですが。*1
とりあえずDebbuging Tools for Windowsはこちらから。
http://www.microsoft.com/japan/whdc/devtools/debugging/default.mspx


SOSっていうのはマネージコードをデバッグするためのデバッガ拡張で。
WinDbgからまずはこんな風にロードします。

.load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\SOS.dll

で、マネージアプリケーションを実行してWinDbgからアタッチすると、CLRのスレッドとかコールスタック情報を表示できたり(・∀・)

【CLRスレッド一覧】
> !threads

ThreadCount: 2
UnstartedThread: 0
BackgroundThread: 1
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                      PreEmptive   GC Alloc           Lock
       ID OSID ThreadOBJ    State     GC       Context       Domain   Count APT Exception
   0    1  9ac 00162898      6020 Enabled  017083d8:01708d1c 0015b140     0 STA
   2    2  a94 0016ec58      b220 Enabled  00000000:00000000 0015b140     0 MTA (Finalizer)

【スレッド0に変更】
> ~0s

...

【CLRスタックの表示】
> !clrstack

OS Thread Id: 0x9ac (0)
ESP       EIP     
0012edc0 7c94eb94 [InlinedCallFrame: 0012edc0] System.Windows.Forms.UnsafeNativeMethods.WaitMessage()
0012edbc 7b08491c System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32, Int32, Int32)
    PARAMETERS:
        this = 0x016f3238
        dwComponentID = <no data>
        reason = 0x00000004
        pvLoopData = 0x00000000

...

0012f470 7b0c69fe System.Windows.Forms.Application.Run(System.Windows.Forms.Form)
    PARAMETERS:
        mainForm = <no data>

0012f480 011200a8 Store.Program.Main()
0012f69c 79e88f63 [GCFrame: 0012f69c]

他にもメモリのダンプ、ジェネレーション0、1、2の情報の表示だとか、色々なInside情報にアクセスできるんですね。


ちなみに.NET&Windowsプログラマのためのデバッグテクニック徹底解説 (マイクロソフト公式解説書)は持っていないんですが、この辺のマネージドな話についても書いてあるんでしょうかね?
貧乏人にはお値段がな〜(´ω`)

*1:WinDbgを使うなんて、ドライバ研修以来じゃないかしら?