Windows自帶的小巧的調試利器--Dr.Watson

1.Dr.Watson是什麼?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

          Dr.Watson( drwtsn32.exe)Windows自帶的調試工具,相比於比較專業的程序調試工(WinDbg,Ntsd…)她顯得比較的弱小,但是在如下場合她應該是比較好的一種選擇:

a.       在沒有安裝任何調試工具的測試機器上我們的程序崩潰了.怎麼辦?是把Windows彈出來的報錯的對話框抓屏發給開發人員看嗎?說實話那個對話框對開發人員來說信息太少了,唯一能斷定的是:,這個程序崩潰了.

b.       在最終用戶的機器上;我們的程序已經發售到了最終用戶手上,程序崩潰了,怎麼辦?問題出在哪?

在這個時候Dr.Watson顯出了她的優勢:她是Windows自帶的調試工具,不需要另外安裝,而且她能提供給開發人員必要的信息去確定問題 的所在.

這就是說Dr.Watson能在如下時刻幫助我們:

1.       應用程序崩潰了(Crash);

2.        應用程序遇到了異常(Exception)(:產生了異常如果我們採取了一切措施,比如Try-Catch機制,並不會導致崩潰)

 

2.Dr.Watson什麼時候會被運行起來?

           如果你的機器上Dr.Watson被設置成默認的調試工具那麼當你的Windows中任何程序崩潰的時候Dr.Watson會自動運行,當然她的運行也許沒有界面(可以在Dr.Watson界面中設置),她只是默默的產生了一個包含錯誤信息的文件存放在特定的路徑下.這時候你要做的也許就是把這個包含錯誤信息的文件發給開發人員.注意我們前面說到的如果Dr.Watson被設置成默認的調試工具那麼….”也就是說Dr.Watson有可能並不是你機器上的默認的調試工具,比如說你安裝了VC6++那麼VC6++就會成爲你的默認的調試工具….那如何把我們的Dr.Watson妹妹設置成默認的調試工具呢??請參看4.如何把 Dr.Watson設置成Windows默認的調試工具?

           另外一種運行Dr.Watson的方式就是在Run(運行)處輸入drwtsn32回車.

 

3.當有程序崩潰的時候 Dr.Watson會產生什麼文件?存在哪?

                 Dr.Watson產生的drwtson32.log,user.dmp文件,其中drwtson32.log是一個文本文件,大家隨便找一個TextEdit就可以打開,裏面包含的信息的解釋稍後有詳細的介紹,user.dmp文件是提供給WinDbg之類的稍專業一點的調試工具用的,WinDbg可以導入user.dmp文件然後看到崩潰的現場.

           文件的存放位置是可以在Dr.Watson中設置的,默認的存放位置和Windows的版本有關係:

  • Windows NT   :  %UserProfile%/Local Settings.

  • Windows 2000 : %AllUsersProfile%/Documents/DrWatson.

  • Windows 2003 : %AllUsersProfile%/Application Data/Microsoft/Dr Watson .

  • Windows XP   : %AllUsersProfile%/Application Data/Microsoft/Dr Watson .

下面是我的WinXP機器上的文件位置:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2003-10-291311070.jpg

4.如何把 Dr.Watson設置成Windows默認的調試工具?

                 Start(開始)àRun(運行),輸入drwtsn32 –i回車,好了,現在Dr.Watson就是你的Windows的默認的調試工具了.

 

5.如何讓 Dr.Watson只關心我指定的程序的崩潰情況?

                 大部分時間我們並不關心別的程序是否崩潰而只是關心我們正在測試/調試的程序,那我們能否讓Dr.Watson只記錄我們感興趣的那個程序的崩潰情況呢??

                  Run(運行)對話框中輸入drwtsn32 -p ProcessID”你就可以指定Dr.Watson只調試指定的進程.

                  ProcessID是什麼?是進程ID

                  那我怎麼去知道我要調試的進程的ID?很簡單:

 

                   1.打開任務管理器(Task Mamager),選擇View->Select Columns;

CSDN_Dev_Image_2003-10-291311072.jpg 

 

    2.然後彈出一個對話框,我們選上 PID那個CheckBox;

CSDN_Dev_Image_2003-10-291311074.jpg

             

好了,我們就可以在任務管理器(Task Mamager)中看到每一個進程的PID.

 

 

6.解讀 Dr.Watson產生的drwtson32.log.

        因爲user.dmp文件主要是提供給其他調試工具用的所以我們來看看drwtson32.log文件裏面都是些什麼東西….

  A. 我們寫一個簡單的會崩潰的程序(CrashDemo.exe)來說明這個文件包含的信息:

CSDN_Dev_Image_2003-10-291311076.jpg

1. #pragma comment( )指示編譯器爲我們產生PDB文件,關於PDB文件大家需要的話我會有具體的文檔介紹.

 2.AccessViolation函數產生一個訪問異常:0x00000地址寫東西,我沒有任何的Try-Catch機制所以肯定要引發崩潰的.

 

 

B.我們設置一下Dr.Watson…..Run Dialog Box中輸入” drwtsn32”,回車:

 

CSDN_Dev_Image_2003-10-291311078.jpg

 

1.因爲我們前面的程序編譯產生了PDB文件所以我們這裏鉤上”Dump Symbol Table”;

2.Crash Dump Type我們鉤上”Full”.

 

C.,運行一下我們的程序(CrashDemo.exe),崩潰了….我們開始解drwtsn32.log

CSDN_Dev_Image_2003-10-2913110710.jpg

 

這正是我們需要的,打開drwtsn32.log:(下面各個片段出現的順序和真實的drwtson.log文件中的順序一樣)

 

CSDN_Dev_Image_2003-10-2913110712.jpg

CSDN_Dev_Image_2003-10-2913110714.jpg

CSDN_Dev_Image_2003-10-2913110716.jpg

CSDN_Dev_Image_2003-10-2913110718.jpg

下面這個片斷是我們重點要關心的地方,因爲它顯示出了發生崩潰的原因及現場信息:

CSDN_Dev_Image_2003-10-2913110720.jpg

根據上面的信息結合源代碼我們可以定位產生崩潰的位置和原因;如果沒有源代碼那我們只能得出這樣的結論:

1.在源代碼OutputDebugString的調用後面的那個函數出現了非法訪問,它企圖寫內容到0x00000000;

2.出錯的指令位於0x00401063(IP寄存器的值),我們可以根據前面的Module List找到該指令位於哪個模塊(EXE,DLL…).

 

CSDN_Dev_Image_2003-10-2913110722.jpg

接下來是”*----> Raw Stack Dump <----*”這個片斷,如果不是察看地址的值我們也許用不到這個片斷.

CSDN_Dev_Image_2003-10-2913110724.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章