变量dwNKDrWatsonSize
要生成錯誤報告的dump文件,需要至少有128K的內存。OAL層初始化函數OEMInit中,變量dwNKDrWatsonSize就是記錄這個內存的大小。內核會從主內存區域的最后,保留出這一塊內存。設置編譯環境變量SYSGEN_WATSON_DMPGEN,讓鏡像包含有錯誤報告生成器的功能。
?
注冊表中,有保存錯誤報告生成器的設置,如下:
?
錯誤報告傳輸驅動(Error Report Transfer Driver),會把這些設置放到上述的保留內存中。那么錯誤報告生成器就能創建正確的內容。這些信息告訴它那里生成報告和生成何種報告。上述注冊表設置是使用system dump,使用4倍保留內存的磁盤空間去存放報告。
?
Dump文件的各個類型,有統一的格式:
1、? context dump
4K到64K大小
crash系統的信息
發生錯誤線程的context記錄
發生錯誤線程的模塊列表
發生錯誤線程的線程列表
發生錯誤線程的調用棧
發生錯誤線程中,發生錯誤位置上下64字節的內存內容
發生錯誤線程的堆棧,最大保存64K
?
2、? system dump
64K以上
Context dump的所有信息
所有線程的context記錄和調用棧
所有模塊、進程、線程的列表
發生錯誤線程中,發生錯誤位置上下2K字節的內存內容
Crash時刻中的全局變量
?
3、? complete dump
所有使用中內存的內容,至少64K大小
Context dump的所有信息
?
錯誤報告生成的文件中,開頭是一個MINIDUMP_HEADER結構體。后面是一些MINIDUMP_DIRECTORY的入口,描述的是數據類型,如系統信息和異常信息等。數據的大小也會記錄下來,還有數據存放的偏移地址。詳細參考$(_COMMONOAKROOT)\INC\DwCeDump.h中內容。
?
錯誤報告傳輸驅動,負責把設置信息從注冊表中,放到保留內存中。同時把生成的文件,復制到可持續保存的介質中(nandflash、SD)。接著它還要通過注冊表,啟動上傳報告的客戶端程序。
鏡像要有錯誤報告傳輸驅動,需要設置編譯環境變量SYSGEN_WATSON_XFER。在注冊表中,還要設置相關屬性。如下,錯誤報告傳輸驅動設置為:每5分鐘喚醒一次,優先級是249。
?
錯誤報告控制面板,也可設置相關屬性,包括:
1、? 打開、關閉錯誤報告(有顯示的設備中,錯誤報告默認是打開的。無顯示設備中,模式是關閉)
2、? 設置dump文件的可用空間大小
3、? 打開用戶通知對話框
?
需要使用錯誤報告控制面板,編譯時候要設置SYSGEN_WATSON_CTLPNL。
錯誤報告控制面板的注冊表內容,存放在HKLM\System\ErrorReporting\DumpSettings和路徑HKLM\System\ErrorReporting\UploadSettings中。
?
報告上傳的客戶端,負責把錯誤報告發送到watson.microsoft.com網站上。也可以發送到其他網站,但是需要修改代碼,在(_PUBLICROOT) \WCESHELLFE\OAK\WATSON\DWUI\ DWUIDLGS.CPP。另外,(_PUBLICROOT) \COMMON\OAK\INC\DWPUBLIC.H中,需要定義一個有效的服務器VALID_RESPONSE_SERVER。
?
當應用程序crash后,Dr.Watson開始工作,調用GenerateDumpFileContent函數。這個函數完成大部分的工作,它首先通過設置高優先級,來確保Dr.Watson不被搶占。然后搜集系統、模塊、異常、進程和線程等信息,放到文件的CRASH_DATA結構體中。當信息收集完畢,它會恢復到原來狀態,寫入crash信息,生成dump文件。
?
在Dr.Watson的幫助下,福爾摩斯們就能通過錯誤報告工具,去分析和調試程序了。
?
?
還可以通過以下方式進行調試:
一、使用PB
1、開啟錯誤報告, 設備上的“開始”-〉“設置”-〉“系統”-〉“錯誤報告”-〉“啟用錯誤報告”。
?
2、日常使用(不連接KITL)時,程序發生崩潰,會提示是否把錯誤報告給微軟,此時選擇“發送”(注:如果選擇“不發送”下面的步驟就不要看了)。這樣會生成 “ce+日期+序號.kdmp”文件。
?
3、連接USB ActiveSync,在設備windows\system\dumpfiles下會多一個“ce月日年-序號”的目錄(例如:“Ce032406-1” )其下可以發現 ce+日期+序號.kdmp文件 和 cedevice.log 文件。
?
4、用 Remote File Viewer (PB或VS2005自帶的遠程工具)將這兩個文件download回到電腦上。注意用ActiveSync是無法直接拷貝的,Copy會被告知 AccessDenied。
?
5、用PB-〉File Open打開 xxx.kdmp 文件,之后點擊 Target -〉 Attach 程序就可以恢復到崩潰時候的狀態了。可以看到程序崩潰時候的 call stack/ memory / process 調試了。(至少能定位到時哪個程序調用的時候崩潰了)
?
二、使用UIDumpViewer.exe
微軟還提供了一個調試工具,可以在PC上直接查看dump文件,鏈接地址:
http://www.microsoft.com/downloads/details.aspx?FamilyID=76B18828-09E4-4A87-A8E4-A06F2352B754&displaylang=en&displaylang=en
?
三、根據輸出的提示信息,使用CrashFinder
這個方式需要有源代碼。
編譯工程后,按照出錯的提示信息,add一個出錯的文件(exe、dll)。
輸入crash地址,工具就會列出具體信息。
下載地址:
http://www.wintellect.com/CS/blogs/jrobbins/archive/2006/04/19/crashfinder-returns.aspx
http://www.microsoft.com/msj/0498/bugslayer0498.aspx
?
http://www.windowsfordevices.com/articles/AT7568439504.html
已投稿到: 排行榜 閱讀(95)|評論(1)|收藏(0)|打印|舉報轉載于:https://www.cnblogs.com/Torres_fans/archive/2009/10/11/1580757.html
總結
以上是生活随笔為你收集整理的变量dwNKDrWatsonSize的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新一轮的心情整理(有二年没来这里了)
- 下一篇: Delphi 2010 新增功能之: 软