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