仔细看了昨晚搜刮到的那篇关于WinCE错误报告的文章,受益匪浅。使用流程已经介绍得足够详细,这里不再赘述。需要参考的同志,请直接看原文。这里补充一点原文中貌似没讲到的,个人觉得很关键的地方,如何在产品中保留错误报告。
那篇文章中提到要将错误报告从Windows的目录下拷贝到别的非易失性的存储器中,以便后续的分析与处理。这在开发过程中是没有问题的。但如果产品已经发布,我们需要从客户的设备中获取错误报告,就行不通了。
最初测试时发现,当应用程序出错时会在Windows的目录下生成错误报告,但选择“不发送”,从而关闭“错误报告”对话框后,生成的错误报告文件被自动删除。我想原文之所以说要拷贝出来,大概就是这个原因。很显然,我们需要将该目录直接挪到SD卡或者NAND目录中,并且阻止系统自动删除该文件。
尝试了半天,终于找到了解决办法,修改注册表的相关键值即可。需要修改的主要有以下两项。
"DumpDirectory"="\\Windows\\DumpFiles" ;此处修改为指定的目录
"ExtraFilesDirectory"="\\Windows\\ExtraDumpFiles" ;此处修改为指定的目录
"CabDirectory"="\\Windows\\DumpFiles\\CabFiles" ;此处修改为指定的目录
"UploadClient"="\\Windows\\Dw.exe"
"MaxDiskUsage"=dword:80000
"DumpEnabled"=dword:1
[HKEY_LOCAL_MACHINE\System\ErrorReporting\UploadSettings]
"NoConsentRequired"=dword:0 ;此处修改为1,取消弹出提示框
"DontUpload"=dword:0 ;此处修改为1,取消上传及自动删除,使其保留在目录中
"MaxWeeklyReports"=dword:0
"MaxDailyReports"=dword:0
"UploadSucceededDlg"=dword:0
"UploadFailedDlg"=dword:0
[HKEY_LOCAL_MACHINE\init]
"Launch95"="dw.exe" ;删除该项,禁止该程序自启动
另外,需要在指定的目录下创建Dumpfiles的目录,否则错误报告也不能正确生成,特别需要注意这一点。所有的配置正确后,再次运行Crash.exe,就可以在B:\Dumpfiles\Ce092009-01目录下生成一个名为Ce092009-01.kdmp的文件。我是在模拟器中测试的,将B:\(Ramdisk)用做模拟器的Storage Card,所以是在该目录下生成了该文件。下面就可以用WinDgb工具进行分析获得的错误报告了。先设定源代码目录、映像目录、符号文件目录,然后打开Ce092009-01.kdmp文件,就可以在源代码中定位到出错的位置,如下图所示。
至此,这个BUG就一目了然了,Fix也是很容易的事。
折腾了大半天,最后发现其实改动很小,仅仅是注册表中的几个键值。可不折腾,又怎么知道修改什么地方,怎么修改呢?最近调试一个新的开发板,也有同样的感受,最后修改也许很简单,但如何定位到这个需要修改的地方及如何修改则需要花很多时间。不过没关系,我还是挺爱折腾这些的。
昨天折腾了一个左道,应该能缓解一下目前存在的问题。今天折腾了一个正道,应该能有助于问题的最终解决,双管齐下,希望能让产品更稳定。
WinDbg的下载地址:http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.402.msi,它是一个很强大的工具,用好了也是一门学问,有时间再进一步学习。