程序員都知道,在生產環境中,若是沒有系統日誌,對問題的分析將很是的困難。即便有日誌,有時候也會由於日誌記錄的不全面,而致使問題不能分析清楚。其實,Windbg裏面有Live Debug功能,正好能夠借鑑應用。程序員
本文介紹使用Windbg在.net程序中設置斷點調試的方法。Windbg在Native Code裏面下斷點是比較方便的,bp加上一個內存地址就能夠作到。下面進入正題。spa
下面是一段程序,編譯運行的程序名爲MyApp.exe。.net
class Program3d
{調試
static void Main(string[] args)日誌
{內存
System.Console.WriteLine("Press any key to be continue...");string
Test("Hello");it
System.Console.ReadLine();編譯
}
public voidTest(string data)
{
Console.WrilteLine(data);
}
}
加入如今要對Test方法設置斷點,查看data參數的狀況。步驟以下:
步驟一:加載 clr
0:000>.loadby sos clr
步驟二:列示Program類型全部方法的信息,並找到 Test方法的MethodTable地址
0:000> !name2ee *!MyApp.Program
Module: 790c2000 (mscorlib.dll)
--------------------------------------
Module: 00a82c3c (MyApp.exe)
Token: 0x02000002
MethodTable: 00a83038
EEClass: 00a811d8
Name: MyApp.Program
步驟三:獲得了Program類的MethodTable的地址了,獲取MethodTable詳細信息,找到Test方法的MethodDesc信息。
0:000> !dumpmt -md 00a83038
EEClass: 00a811d8
Module: 00a82c3c
Name: MyApp.Program
mdToken: 02000002 (E:"myProject"MyApp"MyApp"bin"Debug"MyApp.exe)
BaseSize: 0xc
ComponentSize: 0x0
Number of IFaces in IFaceMap: 0
Slots in VTable: 7
--------------------------------------
MethodDesc Table
Entry MethodDesc JIT Name
79371278 7914b928 PreJIT System.Object.ToString()
7936b3b0 7914b930 PreJIT System.Object.Equals(System.Object)
7936b3d0 7914b948 PreJIT System.Object.GetHashCode()
793624d0 7914b950 PreJIT System.Object.Finalize()
00db0070 00a83020 JIT MyApp.Program.Main(System.String[])
00db0110 00a83028 JIT MyApp.Program.Test
(System.String)
00db00e0 00a83030 JIT MyApp.Program..ctor()
步驟四:獲取Test方法的執行地址:
0:000> !dumpmd 00a83028
Method Name: MyApp.Program.ShowParams(Int32, System.String, Char)
Class: 00a811d8
MethodTable: 00a83038
mdToken: 06000002
Module: 00a82c3c
IsJitted: yes
m_CodeOrIL: 00db0110
步驟五:增長斷點
0:000> bp 00db0110
也能夠用BPMD命令在這個方法的MethodDesc上面下斷點:
0:000> !bpmd -md 00a83028
MethodDesc = 00a83028
Setting breakpoint: bp 00DB0110 [MyApp.Program.Test(System.String)]
步驟六:繼續調試
0:000>g
步驟七:單步調試:F10.
步驟八:查看參數信息。運行下面指令,獲取到Test方法的的Data參數地址,!do查看便可。
0:000> !clrstack -a
完工!