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