高度なデバッグ
プログラミング 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プログラマのためのデバッグテクニック徹底解説 (マイクロソフト公式解説書)は持っていないんですが、この辺のマネージドな話についても書いてあるんでしょうかね?
貧乏人にはお値段がな〜(´ω`)