如何读取故障转储文件(我有源代码和 .pdb 文件)

Posted

技术标签:

【中文标题】如何读取故障转储文件(我有源代码和 .pdb 文件)【英文标题】:How to read a crash dump file (I have source code and .pdb files) 【发布时间】:2013-02-05 08:07:47 【问题描述】:

我已经阅读了 *** 上的问题,但我仍然无法使其发挥作用。

我有

来自客户的小型转储文件 与客户获得的代码版本完全相同 在调试目录中,.pdb 文件用于代码。

我尝试将迷你转储文件放在调试目录中,然后在 Visual Studio 2010 中打开它。 我不知道这是否是正确的做法,或者下一步该做什么。

“开始调试”在正常的“调试”菜单中显示为灰色。

小型转储文件摘要选项卡的右上角有一个带有“操作”的框。所以我点击了“仅使用本机调试”,但我得到的只是“当前位置没有可用的源代码。”

我一定遗漏了一些非常简单的东西 - 请有人给我一个提示吗?

【问题讨论】:

您有在构建程序时创建的 .pdb 文件吗?仅仅重建相同的源是行不通的,你需要为每个构建保留 .pdb 文件。 另外,您需要在 Debugger 选项中启用 Microsoft Symbol Server。 @AlexFarber 感谢您的回复。您的意思是从 Microsoft 符号服务器加载 Microsoft 库的符号吗?我已经做到了。 我只是在检查 .pdb 文件(我不知道!)。 在 Visual Studio 中分析崩溃转储***.com/q/12252407/1888362 【参考方案1】:

只是将各种信息汇总成一个答案:

您是否有在构建程序时创建的 .pdb 文件?仅仅重建相同的源是行不通的,您需要为每个构建保留 .pdb 文件。 – Alex Farber 2013 年 2 月 20 日 11:05

“在将 PDB 与二进制文件(DLL 或 exe)匹配时,调试器会匹配文件名、时间戳和校验和等信息。” (Saikat Sen, Codeproject article)

按照 AlexFarber 的提示,我将客户构建的源代码和发布文件夹复制到我的计算机上(整个构建已保存,包括发布文件夹中的 .pdb 和 .exe 文件)。

然后我将转储文件复制到发布文件夹中,并将 Microsoft 符号加载到同一文件夹中。

然后我再次将转储文件打开到 Visual Studio 2010。

我没有看到比以前更有帮助的东西,我认为这是由于 - see the accepted answer on this SO question。我正在使用 C# 和 .NET 2.0 程序集,似乎只能查看 .NET 4.0 程序集的源代码。

接下来我将尝试 Hans Passant 在同一问题上推荐的名为 sos.dll 的 WinDbg 插件。

如何避免使用同一构建中的 pdb 文件:

如果您使用 WinDbg,我认为您可以绕过对相同 .pdb 文件的此要求。来自virtualdub“如果调试器很顽固并且不想加载符号,因为它认为它们不匹配,您可以使用 .symopt+ 0x40 来设置“加载任何东西”标志。”

另外,如果我理解正确,您可以使用上面 sergmat 提到的 chkmatch 工具来匹配 .exe 和 .pdb 文件。

【讨论】:

【参考方案2】:

据我了解,您有一个客户的小型转储,我认为他正在使用您的应用程序的发布版本和调试 PDB 文件。

那是你的问题,你的 PDB 和迷你转储不匹配。为了查看清晰的堆栈跟踪,PDB 应具有与生成转储文件的应用程序之一相同的构建配置/平台。

【讨论】:

Relasee 和 Debug 从来没有为我工作过......我说的是多年的经验

以上是关于如何读取故障转储文件(我有源代码和 .pdb 文件)的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中分析故障转储

如何使用 WinDbg 分析 VC++ 应用程序的故障转储?

如何读取小型转储?

ADPlus 转储分析。如果生产中不存在 PDB 文件?

如何获取 erlang 故障转储文件?

读取 .pdb 文件