深入探究Windows错误调试与报告机制
在软件开发和系统运维过程中,错误调试与报告是解决问题、提升软件质量的关键环节。本文将详细介绍Windows系统中利用转储文件进行事后调试以及Windows错误报告服务的相关内容。
1. 转储文件的使用
转储文件是进程状态的静态快照,可用于事后调试。在使用转储文件时,需要注意以下几点:
-
生成转储文件
:使用
kd> .dump /f %temp%\full.dmp
命令可生成完整但较大的转储文件。不过,通过COM端口创建完整内核转储是一个非常缓慢的操作,可能需要数小时才能完成,若想终止命令可按
Ctrl - C
。
-
使用转储文件进行调试
:转储文件分析类似于手动调试,因为它是静态的,无法设置断点和单步执行代码。但许多调试器命令在使用转储文件时仍然有效,通过耐心分析,通常可以找到问题的根源。
-
符号文件的重要性
:转储文件不包含符号信息,因此在分析转储文件时,符号文件至关重要。由于应用程序会不断发展和更新,建议设置符号服务器来管理符号文件。
2. 转储文件分析示例
2.1 访问冲突分析
以下是分析访问冲突的具体步骤:
1.
打开转储文件
:使用
C:> windbg –z C:\AWDBIN\Dumps\dumpfile.dmp
命令告诉调试器要分析转储文件。
2.
查看访问冲突输出
:启动调试器后,首先关注访问冲突输出,如
(9d8.f0c): Access violation - code c0000005
。
3.
查看堆栈跟踪
:使用
0:000> kb
命令查看违规线程的堆栈跟踪,了解访问冲突发生时的操作。
4.
反汇编代码
:使用
0:000> u awdscenario1!wmain+0xbe
命令反汇编顶部帧,查看访问冲突发生时正在执行的代码。
5.
检查寄存器值
:使用
0:000> r
命令检查寄存器值,以确定问题的具体原因。例如,当
eax
寄存器的值为
0
时,说明违规的
mov
指令试图将值
0
存储到内存位置
0
,从而导致访问冲突。
2.2 句柄泄漏分析
句柄泄漏是另一种常见的问题,以下是分析句柄泄漏的步骤:
1.
运行应用程序并生成转储文件
:运行示例应用程序
C:\AWDBIN\WinXP.x86.chk\09HLeak.exe /t:20 /i:200 /s:0
,使用任务管理器观察句柄使用情况的急剧增加。在应用程序退出前,使用
0:000> .dump /mf c:\dumpfile.dmp
命令生成转储文件。
2.
检查句柄信息
:使用
0:000> !handle
命令查看句柄使用情况,但发现该命令报错。原因是生成转储文件时仅使用
/mf
开关是不够的,若要包含句柄信息,还需添加
h
开关,即使用
.dump /mfh c:\dumpfile3.dmp
命令重新生成转储文件。
3.
分析句柄泄漏原因
:重新加载转储文件后,再次使用
!handle
命令可以获取句柄信息。发现存在大量的令牌句柄,可使用
!htrace
命令查找句柄的分配源,但该命令在转储文件上无法使用。解决方法是在实时机器上运行
htrace
并将结果输出到日志文件,然后结合转储文件和日志文件进行分析。
3. Dr. Watson的使用
Dr. Watson是Windows中用于生成错误报告信息的工具,可将信息发送到Windows错误报告服务。以下是关于Dr. Watson的详细介绍:
-
配置Dr. Watson
:通过运行
drwtsn32.exe
可以自定义Dr. Watson的错误收集行为,包括日志文件路径、崩溃转储路径、反汇编指令数量、保存的错误数量、崩溃转储类型等。
-
收集的信息
:Dr. Watson生成的日志文件包含一个或多个应用程序异常部分,每个部分包含应用程序的详细信息,如应用程序路径、故障时间、异常编号等。此外,还包括系统信息、任务列表、模块列表、线程状态转储、堆栈回溯和原始堆栈转储等。
-
关闭Dr. Watson
:可以通过右键单击“我的电脑”,选择“属性”,然后在“高级”选项卡中选择“禁用错误报告”或“启用错误报告”来控制Dr. Watson的行为。
4. Windows错误报告服务
Windows错误报告(WER)是一个失败数据聚合服务,使Microsoft和独立软件供应商(ISV)能够轻松访问与他们的应用程序相关的失败数据。
4.1 WER的工作原理
当应用程序崩溃时,用户会看到Dr. Watson的用户界面,并可以选择将错误报告发送到Microsoft。错误报告通过安全通道(HTTPS)上传到WER服务,该服务将错误信息分类并存储。ISV可以查询WER服务以获取与他们的应用程序相关的崩溃信息,并提供修复或其他有用的响应。
4.2 注册WER服务
注册WER服务需要完成以下两个步骤:
1.
创建用户账户
:首先需要创建公司账户,然后才能创建用户账户。
2.
创建公司账户
:创建公司账户需要完成三个步骤:
- 生成代码签名的
Winqual.exe
文件:使用Class 3数字代码签名证书对
Winqual.exe
文件进行签名,并上传到Microsoft进行验证。
- 提供账单信息:虽然大多数WER功能是免费的,但某些功能需要付费,因此需要提供账单信息。
- 提供联系数据:创建用于访问公司账户的用户账户。
以下是注册公司账户的详细步骤:
1.
下载并签名
Winqual.exe
文件
:从
https://winqual.microsoft.com/signup/winqual.exe
下载
Winqual.exe
文件,保存到
C:\Sign
。从
https://winqual.microsoft.com/signup/signcode.zip
下载代码签名工具,解压到
C:\Sign
。使用
C:\Sign>signcode.exe /spc myCert.spc /v myKey.pvk -t http://timestamp.verisign.com/scripts/timstamp.dll winqual.exe
命令对
Winqual.exe
文件进行签名。
2.
上传签名文件
:将签名后的
Winqual.exe
文件上传到Microsoft进行验证。
3.
提供账单信息
:在账单信息页面输入公司的账单信息。
4.
创建用户账户
:在账户创建页面填写用户名、密码等信息,并确保密码符合要求。
5.
设置权限和签署法律协议
:点击“管理权限”链接,启用“签署主法律协议”、“查看WER数据”和“下载WER数据”复选框,然后点击“更新”按钮。使用
https://winqual.microsoft.com/member/LAC/DocumentDetails.aspx?id=420&type=0
链接签署法律协议。
注册完成后,可以使用
https://winqual.microsoft.com/default.aspx
登录WER服务,访问其全部功能。
4.3 导航WER网站
登录WER网站后,主要的导航部分包括“Windows徽标计划”、“Windows错误报告”和“驱动程序分发中心”。本文主要关注“Windows错误报告”部分的软件部分。
-
产品汇总
:“产品汇总”选项按产品名称和版本组织错误报告,每个产品有“事件列表”和“热门列表”两个列。“事件列表”显示应用程序发生的所有事件的详细列表,“热门列表”显示过去90天内应用程序的主要问题。
-
管理选项
:“管理映射”选项允许将二进制文件与产品进行映射,以便WER知道哪些二进制文件属于哪个产品。“管理响应”选项允许定义对客户报告的常见问题的响应,创建反馈循环。“入门”选项提供帮助页面。
4.4 映射二进制文件到产品
为了确保错误信息正确路由到公司账户,需要将应用程序的二进制文件映射到特定产品。具体步骤如下:
1.
下载并运行映射工具
:从
http://www.microsoft.com/downloads/details.aspx?FamilyId=4333E2A2 - 5EA6 - 4878 - BBE5 - 60C3DBABC170&displaylang=en
下载Microsoft产品反馈映射工具。
2.
创建映射文件
:运行工具,选择“创建新映射文件”,输入产品文件目录路径、产品名称和产品版本,然后指定映射文件的名称,如
C:\testmap.xml
。
3.
上传映射文件
:在向导的最后一步,勾选复选框,点击“完成”,然后在文件上传页面输入映射文件的路径并点击“提交”。
4.5 查询WER服务
创建账户并映射二进制文件后,可以查询WER服务以获取上传的错误报告。运行应用程序多次,当应用程序崩溃时,让Dr. Watson将错误信息上传到WER网站。由于存在时间延迟,通常需要等待约7天才能查看报告。在“产品汇总”页面可以看到映射的产品和报告的事件总数。点击“事件列表”图标可以查看事件的详细信息,包括事件签名、事件时间趋势和平台详细信息。点击“cabs”列的图标可以获取与事件相关的文件,其中包含关键的转储文件,可用于事后调试。
4.6 提供响应
在事件详细页面,如果尚未为事件记录响应,可以在页面顶部注册响应。响应可以在事件、应用程序或模块级别进行注册。以事件级响应为例,注册响应需要提供以下信息:
-
产品名称
:输入产品名称。
-
解决方案/信息的URL
:输入指向响应信息页面的URL。
-
响应模板
:可以选择预定义的模板或使用自定义模板。
-
响应模板预览
:显示响应中包含的信息预览。
-
附加信息
:输入需要包含的附加信息。
总结
通过本文的介绍,我们了解了Windows系统中利用转储文件进行事后调试的方法,以及Windows错误报告服务的工作原理和使用方法。转储文件分析是解决软件问题的重要手段,而WER服务则为ISV提供了一个强大的工具,用于收集和分析应用程序的错误信息,从而提高软件的质量和稳定性。
graph LR
A[应用程序崩溃] --> B[Dr. Watson捕获错误]
B --> C{用户选择}
C -->|发送报告| D[通过HTTPS上传到WER服务]
C -->|不发送报告| E[本地保存错误信息]
D --> F[WER服务分类存储信息]
F --> G[ISV查询错误信息]
G --> H{是否修复问题}
H -->|是| I[提供响应]
H -->|否| J[继续分析]
I --> K[用户下次遇到问题时显示响应]
| 步骤 | 操作 | 命令或工具 |
|---|---|---|
| 1 | 生成转储文件 |
kd> .dump /f %temp%\full.dmp
|
| 2 | 打开转储文件进行调试 |
C:> windbg –z C:\AWDBIN\Dumps\dumpfile.dmp
|
| 3 | 查看访问冲突输出 |
.ecxr
|
| 4 | 查看堆栈跟踪 |
0:000> kb
|
| 5 | 反汇编代码 |
0:000> u awdscenario1!wmain+0xbe
|
| 6 | 检查寄存器值 |
0:000> r
|
| 7 | 生成包含句柄信息的转储文件 |
.dump /mfh c:\dumpfile3.dmp
|
| 8 | 查看句柄信息 |
0:000> !handle
|
| 9 | 运行htrace并记录到日志文件 |
0:000> !htrace –enable
、
0:000> .logopen c:\handles.log
、
0:000> !htrace -diff
、
0:000> .logclose
|
| 10 | 注册WER服务 | 按步骤创建用户账户和公司账户,包括代码签名、上传文件、提供账单信息等 |
| 11 | 映射二进制文件到产品 | 使用Microsoft产品反馈映射工具创建并上传映射文件 |
| 12 | 查询WER服务 | 在WER网站的“产品汇总”页面查看报告 |
| 13 | 提供响应 | 在事件详细页面注册响应,填写相关信息 |
深入探究Windows错误调试与报告机制
5. 实际案例分析
为了更好地理解上述调试和报告机制,下面通过一个具体的案例来详细说明整个流程。
假设我们有一个名为
awdscenario1.exe
的应用程序,在运行过程中频繁崩溃。我们将按照前面介绍的方法来分析问题并解决。
5.1 生成转储文件
首先,我们要确保Dr. Watson已正确配置为默认的事后调试器。运行以下命令:
drwtsn32.exe -i
然后运行
awdscenario1.exe
应用程序:
C:\AWDBIN\WinXp.x86.chk\awdscenario1.exe
当应用程序崩溃时,Dr. Watson会弹出消息框。我们选择“不发送”,然后查看Dr. Watson生成的日志文件,路径为:
Documents and Settings\All Users\Application Data\Microsoft\Dr Watson\ drwtsn32.log
同时,在相同目录下会有一个名为
user.dmp
的转储文件。
5.2 分析转储文件
使用以下命令在调试器中加载转储文件:
C:> windbg –z Documents and Settings\All Users\Application Data\Microsoft\Dr Watson\user.dmp
启动调试器后,我们可以看到访问冲突的输出:
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(bb0.b6c): Access violation - code c0000005 (first/second chance not available)
eax=00000000 ebx=7ffdf000 ecx=77c418bf edx=77c61b78 esi=01c709ea edi=fcead396
eip=0100127e esp=0007ff1c ebp=0007ff44 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
awdscenario1!wmain+0xbe:
0100127e c60000 mov byte ptr [eax],0 ds:0023:00000000=??
接着,使用
kb
命令查看堆栈跟踪:
0:000> kb
ChildEBP RetAddr Args to Child
0007ff44 01001495 00000001 00032c38 000372c8 awdscenario1!wmain+0xbe
0007ffc0 7c816fd7 fcead396 01c709ea 7ffdf000 awdscenario1!wmainCRTStartup+0x12f
0007fff0 00000000 01001366 00000000 00000000 kernel32!BaseProcessStart+0x23
再使用
u
命令反汇编代码:
0:000> u awdscenario1!wmain+0xbe
awdscenario1!wmain+0xbe:
0100127e c60000 mov byte ptr [eax],0
01001281 eb0e jmp awdscenario1!wmain+0xd1 (01001291)
01001283 68a4100001 push offset awdscenario1!`string’ (010010a4)
01001288 ff1544100001 call dword ptr [awdscenario1!_imp__printf (01001044)]
0100128e 83c404 add esp,4
01001291 688c100001 push offset awdscenario1!`string’ (0100108c)
01001296 ff1544100001 call dword ptr [awdscenario1!_imp__printf (01001044)]
0100129c 83c404 add esp,4
最后,使用
r
命令检查寄存器值:
0:000> r
eax=00000000 ebx=7ffd5000 ecx=77c418bf edx=77c61b78 esi=7c9118f1 edi=00011970
eip=0100127e esp=0007ff1c ebp=0007ff44 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010202
awdscenario1!wmain+0xbe:
0100127e c60000 mov byte ptr [eax],0 ds:0023:00000000=??
从这些信息中,我们可以发现
eax
寄存器的值为
0
,这意味着
mov
指令试图将值
0
存储到内存位置
0
,从而导致访问冲突。
5.3 利用WER服务进一步分析
如果我们希望利用WER服务来收集更多的错误信息,首先要完成WER服务的注册。按照前面介绍的步骤,创建用户账户和公司账户,包括代码签名、上传文件、提供账单信息等。
注册完成后,将
awdscenario1.exe
的二进制文件映射到特定产品。使用Microsoft产品反馈映射工具,按照以下步骤操作:
1. 从
http://www.microsoft.com/downloads/details.aspx?FamilyId=4333E2A2 - 5EA6 - 4878 - BBE5 - 60C3DBABC170&displaylang=en
下载工具。
2. 运行工具,选择“创建新映射文件”。
3. 输入产品文件目录路径(如
C:\AWDBIN\WinXp.x86.chk
)、产品名称(如
AWD Scenario1
)和产品版本。
4. 指定映射文件的名称,如
C:\testmap.xml
。
5. 上传映射文件。
之后,多次运行
awdscenario1.exe
,当应用程序崩溃时,让Dr. Watson将错误信息上传到WER网站。等待约7天后,在WER网站的“产品汇总”页面可以看到映射的产品和报告的事件总数。点击“事件列表”图标可以查看事件的详细信息,包括事件签名、事件时间趋势和平台详细信息。点击“cabs”列的图标可以获取与事件相关的文件,其中的转储文件可用于进一步的事后调试。
6. 最佳实践和注意事项
在使用转储文件进行调试和利用WER服务时,有以下一些最佳实践和注意事项:
6.1 转储文件生成
-
尽量使用
/ma开关生成转储文件,这样可以包含尽可能多的信息,有助于更全面地分析问题。 - 对于内核转储,要注意通过COM端口创建完整内核转储是非常缓慢的操作,需要提前做好时间规划。
6.2 符号文件管理
- 及时设置符号服务器,确保在分析转储文件时能够正确加载符号信息,提高调试效率。
- 对于不同版本的应用程序,要做好符号文件的版本管理,避免因版本不匹配导致分析结果不准确。
6.3 WER服务使用
- 积极鼓励用户上传错误报告,这有助于收集更多的错误数据,提高软件的质量和稳定性。
- 在注册WER服务时,要严格按照要求完成各个步骤,特别是代码签名和法律协议签署,确保能够正常使用WER服务。
- 定期查询WER服务,及时了解应用程序的错误情况,对于频繁出现的问题要及时进行修复并提供响应。
总结
通过本文的详细介绍,我们全面了解了Windows系统中利用转储文件进行事后调试以及Windows错误报告服务的相关内容。从转储文件的生成、分析,到Dr. Watson的配置和使用,再到WER服务的注册、导航、二进制文件映射、查询和提供响应,我们掌握了一套完整的错误调试和报告流程。
在实际应用中,我们可以根据具体情况灵活运用这些方法和工具,及时发现和解决软件中的问题,提高软件的质量和用户体验。同时,要遵循最佳实践和注意事项,确保整个调试和报告过程的准确性和有效性。
graph LR
A[应用程序崩溃] --> B[生成转储文件]
B --> C[分析转储文件]
C -->|发现问题| D[修复问题]
C -->|无法解决| E[使用WER服务]
E --> F[注册WER服务]
F --> G[映射二进制文件到产品]
G --> H[上传错误报告]
H --> I[查询WER服务获取信息]
I --> J[分析信息并提供响应]
J --> K[更新应用程序]
K --> L[再次测试应用程序]
L -->|仍有问题| E
L -->|问题解决| M[结束]
| 最佳实践和注意事项 | 具体内容 |
|---|---|
| 转储文件生成 |
使用
/ma
开关;注意内核转储时间
|
| 符号文件管理 | 设置符号服务器;做好版本管理 |
| WER服务使用 | 鼓励用户上传报告;严格注册流程;定期查询并响应 |
超级会员免费看
22万+

被折叠的 条评论
为什么被折叠?



