Windbg斷點調試.net程序

      程序員都知道,在生產環境中,若是沒有系統日誌,對問題的分析將很是的困難。即便有日誌,有時候也會由於日誌記錄的不全面,而致使問題不能分析清楚。其實,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

 

完工!

相關文章
相關標籤/搜索