.Net應用程式調試之設定斷點
在軟體調試過程中,斷點功能至關重要,想像一下,如果沒有斷點功能,那麼當我們需要查看特定函數的執行情況時,該是多麼的困難。
.Net應用程式雖然是在執行過程中將中間代碼編譯成本地代碼,也就是說如果中間代碼未被編譯成本地代碼之前,我們無法用bp 命令來設定斷點,而我們又很難知道中間代碼何時被編譯成本地代碼,看似是一個很困難的任務,但所幸Windbg.exe 的外掛程式SOS.dll 與SOSex.dll提供了一些有用的擴充命令來協助我們完成該任務。
先來看SOS.dll提供的BPMD 命令的應用
!BPMD命令格式如下所示:
0:004> !help bpmd
-------------------------------------------------------------------------------
!BPMD [-nofuturemodule] <module name> <method name>
!BPMD -md <MethodDesc>
!BPMD -list
!BPMD -clear <pending breakpoint number>
!BPMD -clearall
從以上可知BPMD支援通過函數名或函數地址來設定斷言
其中值得注意有以下2點:
1:若通過!BPMD [-nofuturemodule] <module name> <method name> 來設定斷點,則需要在<method name> 包含命名空間,如下例所示
!BPMD ConsoleApplication TEST.CTest.Hello
其中TEST為命名空間
2:若斷點設定的函數若未被編譯成本地代碼,BPMD 將會在收到該斷點函數被編譯成本地代碼時設定斷點,同時如果要設定斷點的函數所在的模組未被載入,則應該加上-nofuturemodule選項以通知BPDM 模組可能沒有被載入
另外sosex.dll裡提供了一個特別有用的斷點設定函數,可以通過指定原始碼行號來設定斷點,命令格式為:
!sosex.mbp <source file> <line number> [column number> [Options] "command"
其中各欄位功能如下所示:
1:source file 原始碼名
2:line number 行號
3:column number 列號
4: Options 選擇性參數:
/1 設定一次斷點
/p:n 在跳過n次後設定斷點 /p:3表示在第3次執行到該處代碼時設定斷點
5:/t:n :在指定的線程斷點
6:"command" 斷點觸發時所執行的命令
2013-05-08cuiweican