第二部分:Windows 调试技术 - 应用程序崩溃调试 (DebugDiag, AppVerifier)






4.91/5 (18投票s)
这是关于在 Windows 上调试应用程序的各种技术的第一部分,重点关注应用程序崩溃。
引言
本文是《Windows 调试技术》系列的第二部分。本文也集中讨论应用程序崩溃。本文将解释如何使用 Application Verifier 和 DebugDiag 来调试应用程序崩溃。
注意:这是一个系列文章,分为 5 个部分。
第一部分:Windows 调试技术 - 应用程序崩溃调试 (Windbg)
第二部分:Windows 调试技术 - 应用程序崩溃调试 (DebugDiag, AppVerifier)
第三部分:Windows 调试技术——调试应用程序崩溃(自动生成转储)
第四部分:
第五部分:
先决条件
要执行本文下方介绍的实际练习,需要以下工具:
背景
本文将介绍转储分析中的其他技术。这些技术比 windbg 简单得多,但也有其局限性。让我们一一来看。
DebugDiag
“调试诊断工具(DebugDiag)旨在协助解决挂起、性能缓慢、内存泄漏或碎片以及任何用户模式进程崩溃等问题。”(microsoft.com)与用于调试的其他工具相比,DebugDiag 工具使用起来要简单得多。最好的部分是它会生成一个 HTML 报告,其中包含所有详细信息。DebugDiag 可以做很多事情,例如:
- 崩溃分析
- 挂起分析
- 内存泄漏分析
- 性能分析
目前,本文的范围仅限于崩溃分析。我们开始一步一步地操作。
步骤 1:启动 DebugDiag,您将看到此屏幕
这显示了 DebugDiag 提供的不同选项,目前只需单击“取消”并继续。
步骤 2:配置应用程序符号
转到“工具”->“选项与设置”,您将看到以下屏幕。
转到第二个文本框,“符号搜索路径”,添加 PDB 文件的路径。我们将继续使用在第一部分中使用的示例,即 *Appcrash.exe*。
int main()
{
int *p = NULL;
cout<<"This is Start";
*p = 10;
cout<<"This is End";
return 0;
}
步骤 3:启动转储分析
单击“高级分析”选项卡,然后选择“崩溃/挂起分析器”,如下图所示。
步骤 4:添加要分析的转储文件
单击“添加数据文件”按钮,然后选择转储文件,如下图所示。
步骤 5:开始分析
单击“开始分析”按钮,您将看到以下报告。
实际报告的内容远不止这些,但我只截取了最有趣的部分。此堆栈跟踪看起来与我们在 windbg 中看到的非常相似:AppCrash!main+39 [e:\study\windows internals\training\sample code\appcrash\appcrash\source.cpp @ 9]。因此,这再次指向第 9 行,但实际问题发生在第 8 行(详细信息我们在第一部分中已解释)。
我们还看到了其他信息,如 PID、用户模式花费的时间、内核模式花费的时间等。所有这些信息在 Windbg 中也可以找到,但这些信息以易于阅读、理解和传输的格式呈现。这种方法的唯一缺点是,我们只能查看呈现的报告,而不能像在 Windbg 中那样运行命令进行实际分析。如果您只想快速获得转储报告而不必坐下来进行详细分析,这将非常有用。
Application Verifier
“Application Verifier 帮助开发人员快速发现细微的编程错误,这些错误可能比正常的应用程序测试更难识别。在 Visual Studio 中使用 Application Verifier 可以通过识别由堆损坏、不正确的句柄和关键部分使用引起的错误来更轻松地创建可靠的应用程序。”(MSDN)我们将使用 Application Verifier 来生成和分析崩溃转储。
步骤 1:启动 Application Verifier
转到运行命令提示符,键入“AppVerif.EXE”,如下图所示:
您将看到如下屏幕。
步骤 2:添加需要验证的应用程序,在本例中为 AppCrash.exe
我们还需要配置不同的调试参数。在本例中,我们将选择“基本”设置。
步骤 3:单击“保存”,然后单击“退出”
步骤 4:运行应用程序,在本例中为 AppCrash.exe
步骤 5:完成后,再次打开 AppVerifier,如同步骤 1。
步骤 6:配置符号
单击“视图”->“日志”,然后转到屏幕底部,输入 *AppCrash.exe* 的 PDB 文件路径。
步骤 7:单击“查看”按钮
它将在下面的屏幕中显示,其中包含与 Windbg 和 DebugDiag 类似的分析数据。
那么问题来了,使用 Application Verifier 与其他方法相比,我们取得了什么成就?主要的一点是,无需担心获取崩溃转储,它会自动处理。我们可以只配置一次应用程序并正常使用它,每当它失败时,我们都可以随时查看报告。这种方法的缺点是,它需要在目标机器上安装,而这通常是不可行的。Application Verifier 是一个用于在开发周期和开发人员系统上识别问题的工具,这样我们就可以在发布之前评估应用程序中的潜在问题。
摘要
因此,在本篇文章中,我们学习了 DebugDiag 和 AppVerifier。两者都提供几乎相同的输出,但 Debugdiag 提供更多细节。AppVerifier 应在开发周期中使用。DebugDiag 应在发布周期中使用以进行快速分析,但要进行详细分析,WinDbg 是唯一的解决方案。
在第一部分和第二部分中,我们讨论了分析应用程序崩溃的各种方法,但有一个缺点:需要手动获取转储,这显然需要重现问题,而在很多情况下可能无法重现。
请阅读第三部分: https://codeproject.org.cn/Articles/708670/Part-3-Windows-Debugging-Techniques-Debugging-Appl 以了解如何自动创建转储。
历史
- 2014-01-08:文章上传
- 2014-01-20:更新了指向其他部分的链接