如何使用 WinDbg 获取堆栈跟踪

此页面是从 MDN 导入的,内容可能已过时

简介

有时您需要获取崩溃或挂起的堆栈跟踪(调用栈),但由于是特殊崩溃或挂起,Breakpad 失败。本文介绍了如何在 Windows 上使用 WinDbg 获取此类情况下的堆栈跟踪。(要获取 Thunderbird 或其他产品的堆栈跟踪,请在这些说明中将产品名称替换为 Firefox。)

需求

要获取此类堆栈跟踪,您需要安装以下软件

Windows 调试工具

Microsoft 免费提供 Windows 调试工具,其中包括您在此处需要的 WinDbg。从 安装 Windows 调试工具 下载。(即使您使用的是 64 位版本的 Windows,也需要 32 位版本)然后安装它,安装过程中的标准设置即可。

Firefox nightly 或正式版

您需要一个 Firefox 版本,以便可以从 符号服务器 获取符号,并与 WinDbg 一起使用。您可以使用任何来自 Mozilla 的 官方 nightly 版本 或 Firefox 正式版。您可以在 http://ftp.mozilla.org/pub/mozilla.o…/latest-trunk/ 找到最新的 trunk nightly 版本。

调试

要开始调试,请确保 Firefox 未在运行,然后从“开始”菜单打开 WinDbg。(开始->所有程序->Windows 调试工具->WinDbg)接下来,打开“文件”菜单并选择“打开可执行文件...” 在出现的“文件选择器”窗口中,打开 Firefox 程序文件夹中的 firefox.exe 可执行文件(C:Program FilesMozilla Firefox)。

您现在应该会看到一个“命令”文本窗口,顶部显示调试输出,底部有一个输入框。在调试开始之前,必须将几个命令输入到“命令”窗口底部的单行输入框中。

注意

提示:所有命令必须完全按照编写的方式输入,一次一行,输入到“命令”框的底部。

  • 复制粘贴每一行是最简单的方法,可以避免错误

  • 一些命令以句点 (.) 或管道字符 (|) 开头,这是必需的。(美国键盘上管道字符的键击是 SHIFT+)

  • 即使在调试过程中似乎没有任何事情发生,也要提交日志文件到错误报告或支持网站

开始调试

现在 Firefox 在调试器中打开,您需要配置 WinDbg 从 Mozilla 符号服务器下载符号。要加载符号,请输入以下三个命令,每个命令后按 Enter。(更多详细信息请参阅 符号服务器。)

.sympath SRV*c:\symbols*http://symbols.mozilla.org/firefox;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
.symfix+ c:\symbols
.reload /f

现在等待符号下载。这可能需要一些时间,具体取决于您的连接速度;Mozilla 和 Microsoft 符号下载的总大小约为 1.4GB。WinDbg 将在应用程序窗口底部显示“繁忙”,直到下载完成。

下载完成后,您需要配置 WinDbg 以检查子进程、忽略 Flash Player 引起的特定事件以及记录已加载模块的日志。您还需要打开一个日志文件以保存收集的数据。为此,请输入以下四个命令,每个命令后按 Enter。

.logopen /t c:\temp\firefox-debug.log
.childdbg 1
.tlist
sxn gp
lm

如果在 .tlist 的输出中看到 firefox.exe 列出了多次,则表示您已经在运行该应用程序,需要先关闭正在运行的实例,然后再开始调试,否则您将无法获得有用的结果。

现在通过打开“调试”菜单并点击“转到”来运行 Firefox。**在 Firefox 运行期间,您将无法在调试器中输入任何命令。**启动后,尝试重现您看到的崩溃或挂起问题。

注意

如果 Firefox 无法启动,并且您在调试器中看到一行文本后跟一个命令提示符,则可能已触发“断点”。如果系统提示您输入命令但没有看到有关崩溃的错误,请返回“调试”菜单并按“转到”。

浏览器崩溃后,您将在 WinDbg 命令窗口中看到一个错误(例如“访问冲突”)。如果 Firefox 挂起并且调试器中没有命令提示符可用,请打开“调试”菜单并选择“中断”。浏览器崩溃或停止后,继续执行以下步骤。

崩溃或挂起后

您需要捕获调试信息以包含在错误注释或支持请求中。依次输入以下三个命令以获取堆栈跟踪、崩溃/挂起分析和已加载模块的日志。(同样,每个命令后按 Enter。)

~* kp
!analyze -v -f
lm

完成这些步骤后,在硬盘驱动器上找到文件 **c:tempfirefox-debug-(今日日期).txt**。要将信息提供给开发社区,请使用 支持请求 提交此文件,或将其附加到 Bugzilla 上的相关错误报告。

生成小型转储

有时,仅堆栈跟踪不足以供开发人员找出问题所在。开发人员可能会要求您提供“小型转储”或“完整内存转储”,它们是包含有关进程的更多信息的的文件。您可以轻松地从 WinDBG 生成小型转储并将其提供给开发人员

常见问题

问:我正在运行 Windows 7(32 位或 64 位),并且在 WinDbg 命令窗口中看到一个异常,显示“ntdll32!LdrpDoDebuggerBreak+0x2c”或“ntdll32!LdrpDoDebuggerBreak+0x30”。我现在该怎么办?

答:如果在其中任何一个异常之后看到“int 3”,则需要在 WinDbg 中执行以下命令。

bp ntdll!LdrpDoDebuggerBreak+0x30
bp ntdll!LdrpDoDebuggerBreak+0x2c
eb ntdll!LdrpDoDebuggerBreak+0x30 0x90
eb ntdll!LdrpDoDebuggerBreak+0x2c 0x90
确保您一次输入一个,并在每个命令后按 Enter。如果您使用的是 64 位版本的 Windows,则需要在这些命令中将“ntdll”替换为“ntdll32”。
问:我的堆栈跟踪的前四个帧如下所示
0012fe20 7c90e89a ntdll!KiFastSystemCallRet
0012fe24 7c81cd96 ntdll!ZwTerminateProcess+0xc
0012ff20 7c81cdee kernel32!_ExitProcess+0x62

0012ff34 6000179e kernel32!ExitProcess+0x14

这看起来不对劲?!

答:您在未选中“也调试子进程”复选框的情况下运行了应用程序。您需要分离调试器并再次打开应用程序,这次选中该复选框。

问:WinDbg 告诉我它无法验证 firefox.exe 的校验和。这正常吗?

答:是的,这很正常,可以忽略。

问:当 WinDbg 询问我是否“保存工作区信息”时,我应该点击是还是否?

答:点击“是”,WinDbg 将避免您将来在 Firefox.exe 中输入符号位置。如果您不想让 WinDbg 保存此信息,请点击“否”。

问:我在每个线程顶部都看到了“wow64”,这正常吗?

答:不正常,您正在运行 64 位版本的 Windbg 并尝试调试 32 位版本的 Mozilla 软件。请重新下载并安装 32 位版本的 windbg。

故障排除:符号无法下载

如果无论您做什么,符号都无法下载,问题可能是 Internet Explorer 已设置为“脱机工作”模式。您在 Windbg、Visual C++ 或 Visual Studio 中不会收到任何警告。即使使用命令行和 symchk.exe 下载符号也会失败。这是因为 Microsoft 使用 Internet Explorer 的 Internet 和代理设置来下载符号文件。检查 Internet Explorer 的“文件”菜单,确保“脱机工作”未选中。

另请参阅