27、深入探究Windows错误调试与报告机制

深入探究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服务使用 鼓励用户上传报告;严格注册流程;定期查询并响应
C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法扰动观察法在实际光伏系统中的实现机制切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
【无人机协同】动态环境下多无人机系统的协同路径规划防撞研究(Matlab代码实现)​ 内容概要:本文围绕动态环境下多无人机系统的协同路径规划防撞问题展开研究,提出基于Matlab的仿真代码实现方案。研究重点在于在复杂、动态环境中实现多无人机之间的高效协同飞行避障,涵盖路径规划算法的设计优化,确保无人机集群在执行任务过程中能够实时规避静态障碍物动态冲突,保障飞行安全性任务效率。文中结合智能优化算法,构建合理的成本目标函数(如路径长度、飞行高度、威胁规避、转弯角度等),并通过Matlab平台进行算法验证仿真分析,展示多机协同的可行性有效性。; 适合人群:具备一定Matlab编程基础,从事无人机控制、路径规划、智能优化算法研究的科研人员及研究生。; 使用场景及目标:①应用于灾害救援、军事侦察、区域巡检等多无人机协同任务场景;②目标是掌握多无人机系统在动态环境下的路径规划防撞机制,提升协同作业能力自主决策水平;③通过Matlab仿真深入理解协同算法的实现逻辑参数调优方法。; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注目标函数设计、避障策略实现多机协同逻辑,配合仿真结果分析算法性能,进一步可尝试引入新型智能算法进行优化改进。
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 StudentInfo 基于SSM的学生信息管理系统(选课) 已停更 项目简介: 由SpringMVC+MyBatis为主要框架,mysql8.0配置主从复制实现读写分离,主机丛机分别为腾讯云的服务器,而项目部署在阿里云上。 前端主要由bootstrap完成,背景用particles.js插件。 数据库交互查询用到pagehelper分页。 在添加修改相关功能时通过ajax来验证其主键是否存在可用。 代码层次清晰,输入框约束较高,已配置登录拦截。 一、应用技术 #### 工具:eclipse、navicat 环境:JDK1.8、tomcat9.0、mysql8.0 前端:JavaScript、jQuery、bootstrap4、particles.js 后端:maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybatis分页 二、功能 #### 这是在上个springmvc选课系统的基础上进行修改完善的,目前功能基本相同,修复诸多bug,上个系统中有详细介绍:B/S基于springMVC的网上选课系统 主要功能模块图: 新增: 增加分页查询 输入框约束 学号、身份证、课程编号、教师编号只能输入数字,并且有最大输入限制,其中学号固定12位,若小于12位将会有提示。 姓名只能输入中文。 几乎所有输入框不能输入空格等约束 下拉框联动 添加、修改课程采用二级联动,即所属系别——所属专业; 添加、修改学生采用三级联动,即系别——专业——班级。 (三级联动代码有些复杂,因为JavaScript学的不好=-=)。 ajax+springmvc验证 用于验证学号、课程编号、教师...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值