变量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) | 打印 | 举报

你可能感兴趣的:(size)