windbg怎么打开pdb文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windbg怎么打开pdb文件相关的知识,希望对你有一定的参考价值。

用VS调试程序时,有时会在VS底部的“输出”框中提示“无法查找或打开 PDB 文件”。这该怎么解决呢?
下面,我们以VS2013为例,来教大家解决办法。
工具/原料
VS
方法/步骤
打开VS2013,点击菜单“工具”-“选项”。

在选项窗口中,展开“调试”-“常规”,然后在右边的窗格中勾选“启用源服务器支持”。

然后展开“调试”-“符号”,勾选“Windows符号服务器”。

这时,会弹出一个警告对话框,无视点击“确定”即可。

最后,点击“确定”关闭选项窗口。

下面,我们再来点击“本地Windows调试器”调试运行程序。

第一次运行该程序时,会从Windows服务器上下载相关的符号集,这需要一点时间。

稍后,程序就启动了(我这个程序是一个仿QQ聊天界面窗口)。以后,如果再次调试该程序,就无需再次等待了(因为符号集已经从服务器下载到本地)。

END
注意事项
首次调试程序时,需要联网从服务器加载符号集。
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
举报作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
参考技术A 你用 WinDbg 打开一个被调试程序后,输入 symchk 回车,WinDbg 就会自动的连到微软的网站根据你的机器的情况更新的 PDB 文件,并将它保存在上面斜体部分指定的本地路径里,这样你就可以确保你的符号文件版本和你机器上的文件版本一致
SRV*D:\Symbols\websymbols*http://msdl.microsoft.com/download/symbols
(斜体部分是你在本地保存符号文件的路径)
参考技术B PDB文件是Palm OS操作系统上数据文件类型。一般我们在使用Palm系统的电子书时都会遇到这种文件,一般用于电子书或手机电子书
pdb是Palm DataBase的缩写,Palm OS所用文件的扩展名为.pdb。
可以使用PalmReader打开。 如果想把PDB文件转换成TXT文件查看,可以使用WavePDB转。

故障转储 - WinDbg - 强制 PDB 文件匹配不起作用?

【中文标题】故障转储 - WinDbg - 强制 PDB 文件匹配不起作用?【英文标题】:Crash dump - WinDbg - force PDB files to match doesn't work? 【发布时间】:2014-03-20 03:05:32 【问题描述】:

我有一个客户应用程序的故障转储,该应用程序是使用我们在 WinDbg 中分析的非常旧版本的 dll(发布版本,没有原始符号)构建的。

为了获得更多信息,我在发布模式下重新构建了 dll,这次使用符号,使用相同的编译器版本,我相信与最初构建 dll 时相同的设置。我将符号文件添加到我的符号路径中,但 WinDbg 扩展名 !itoldyouso 告诉我转储中的模块与 PDB 文件不匹配。启用 SYMOPT_LOAD_ANYTHING 也无济于事。

!itoldyouso 告诉我它们不匹配,因为模块没有 pdb sig(值 0),而我创建的重新创建的符号文件(具有有效的 pdb sig)。如何让它们匹配?

【问题讨论】:

【参考方案1】:

很遗憾,您的 DLL 没有匹配的符号 :(。据我了解,现在的任何尝试都无法为您提供完全匹配的 PDB。

回收一些应该有帮助的旧线程:

Is it possible to (re)create a PDB file after a DLL is made

Tool to find if dll (or) exe and PDB file match

你最好的选择是

一个。将您的代码同步回 DLL 发布的时间

b.使用相同的工具集构建和创建 PDB。

c。使用 .reload /i 选项加载符号

【讨论】:

【参考方案2】:

你试过.reload /i foo.dll吗?

对于详细输出尝试:

!sym noisy;.reload /i foo.dll;x foo!*test*

【讨论】:

是的,它加载了 foo 的符号,但是在详细的输出中我也看到了不匹配的报告:“DBGENG: foo.dll has mismatched symbols - type ".hh dbgerr003" for details" 当然它们会被报告为不匹配,因为它们不是在构建DLL时构建的。但只要你使用相同的编译器和设置(你提到的)并且源代码根本没有改变,那么符号应该可以工作。 我想我是在假设除非我有一个匹配我根本无法信任调用堆栈,虽然也许正如你所说的它们永远不会匹配,但也许尽管如此我仍然可以有一个大部分是有效的调用堆栈。 为什么会这样?也就是说,/i 是什么意思? 来自 Windbg 的帮助:“忽略 .pdb 文件版本中的不匹配。”【参考方案3】:

尝试 chkmatch (http://debuginfo.com/tools/chkmatch.html) - 它能够覆盖 pdb 文件中的签名,因此 exe 和 pdb 将匹配。另外,前段时间我写了一篇关于“离线”检查pdb文件的帖子,也许你会发现那里有一些有用的东西:http://lowleveldesign.wordpress.com/2011/12/09/pdb-file-out-of-debugger/。

【讨论】:

这是一个很好的建议,但如果年龄字段不同,chkmatch -m 可能会失败,这似乎很可能在这里。二进制文件的 PDB 签名和年龄可能为 0。如果年龄不匹配,chkmatch 不会更改 GUID,而且 PDB 中的年龄几乎肯定不是 0。

以上是关于windbg怎么打开pdb文件的主要内容,如果未能解决你的问题,请参考以下文章

我用VC编写了一个exe,但是生成的pdb怎么也无法用于windbg调试

无法打开或查找PDB文件,怎么解决

如果使用WINDBG来调试C语言程序.

VS“无法查找或打开PDB文件”是怎么回事?如何解决

部分无法查找或打开 PDB 文件

ConsoleApplication1.exe无法查找或打开 PDB 文件是怎么回事?