読者です 読者をやめる 読者になる 読者になる

VB.NETでもWinDbgしたい

はじめに

この記事はWinDbg.NET Frameworkデバッグをするときのコマンドの備忘録です。

解説はありません。希望もありません。

ダンプの取得

ダンプは別途ソフトウェアをインストールする必要なく、タスクマネージャから取得することが可能。

しかし、ダンプを取得するプロセスのビット数に応じてタスクマネージャのビット数を選択する必要がある。

  • 32bit Windows
    • 常に32bitタスクマネージャ(通常起動したタスクマネージャ)
  • 64bit Windows
    • 64bitプロセス
      • 64bitタスクマネージャ(通常起動したタスクマネージャ)
    • 32bitプロセス
      • 32bitタスクマネージャ %windir%\SysWOW64\taskmgr.exe

当該プロセスがどのビット数で動作しているかはタスクマネージャの詳細タブ→プラットフォーム(Windows 10)から確認が可能。

SOSのロード
  • ~.NET 3.5
    • .loadby sos mscorwks
  • .NET 4 ~
    • .loadby sos clr
メソッドにブレークポイントを貼る

!bpmdsos.dllのロードが必要。

Setting .NET breakpoints in Windbg for applications that crash on startup – If broken it is, fix it you should

How to add a breakpoint in a managed generic method in windbg (sos) – I know the answer (it's 42)

JITコンパイル済みネイティブアドレスからMethodDescを検索
0:000> !clrstack
OS Thread Id: 0x2ec0 (0)
Child SP       IP Call Site
012ff14c 0192056e ConsoleApplication2.Module1.Hoge[[System.Double, mscorlib]](Double) [C:\Users\jyuch\Documents\Visual Studio 2015\Projects\ConsoleApplication2\ConsoleApplication2\Module1.vb @ 19]
012ff164 019204c2 ConsoleApplication2.Module1.Main() [C:\Users\jyuch\Documents\Visual Studio 2015\Projects\ConsoleApplication2\ConsoleApplication2\Module1.vb @ 10]
012ff2e8 73e81376 [GCFrame: 012ff2e8] 


0:000> !ip2md 0192056e
MethodDesc:   01444dcc
Method Name:  ConsoleApplication2.Module1.Hoge[[System.Double, mscorlib]](Double)
Class:        0144159c
MethodTable:  01444d70
mdToken:      06000011
Module:       01443fbc
IsJitted:     yes
CodeAddr:     01920550
Transparency: Critical
Source file:  C:\Users\jyuch\Documents\Visual Studio 2015\Projects\ConsoleApplication2\ConsoleApplication2\Module1.vb @ 19
MethodDescからILをダン
0:000> !dumpil 01444dcc
ilAddr = 00e72214
IL_0000: nop 
IL_0001: ldarga.s VAR OR ARG 0
IL_0003: constrained. <unknown token type 1b000000>
IL_0009: callvirt System.Object::ToString 
IL_000e: stloc.0 
IL_000f: br.s IL_0011
IL_0011: ldloc.0 
IL_0012: ret 

おわりに

わあい

おまけ

reflexil.net

よさげ