调试重命名的 DLL?
Posted
技术标签:
【中文标题】调试重命名的 DLL?【英文标题】:Debugging a renamed DLL? 【发布时间】:2015-10-17 08:53:12 【问题描述】:我在尝试调试 DLL 时遇到问题,该 DLL 在后期构建过程中已重命名:WinDBG 无法加载正确的符号(pdb 文件)。示例:原始文件名是:abc.dll创建的 PDB 被命名为:abc.pdb在构建后过程中,DLL 被重命名为“ab.DLL”。由于某种原因,在调试时我可以看到该模块显示为“a_b.dll”(连字符被下划线替换,不知道为什么会发生这种情况)。另外,WinDBG 无法加载它的符号。我试过ld a_b /f abc
,也试过把PDB重命名为'a_b.pdb',然后调用.reload /f /i a_b
,还是不行。所有这些都发生在我的 Release
构建中,它被设置为添加调试信息并创建 PDB,就像它一样。
【问题讨论】:
在.reload ...
之前执行!sym noisy
并查看调试器正在尝试加载什么以及它为什么失败/找不到正确的pdb
编译模块时,调试细节嵌入在 PE 头中。这些详细信息包括在模块和 PDF 之间共享并用于匹配符号的 GUID,以及 PDB 文件的路径。您可以使用“dumpbin /headers PDB 的名称是 DLL 的一部分。重命名 DLL 不会更改其内容,因此重命名 PDB 也将不起作用。而是保留原来的名称。
确保您的符号设置正确,例如使用 Microsoft 符号和您自己的符号:
.symfix c:\debug\symbols
.sympath+ c:\path_to\myproject\bin\Release
.reload
另外,不要担心 WinDbg 中的模块名称。它替换了一些特殊字符,但不会影响符号加载。如果在加载符号时仍然遇到问题,请打开符号调试输出
!sym noisy
这应该显示 WinDbg 尝试从中加载符号的路径和文件名。检查您的位置是否包括在内。如果没有,请通过.sympath+
添加。完成后,通过
!sym quiet
这个命令相当于
.symopt+ 0x80000000 *** noisy
.symopt- 0x80000000 *** quiet
【讨论】:
好的,问题解决了。显然,这是“全部重建并重试”案例中的另一个。很抱歉误报,感谢大家的回答。以上是关于调试重命名的 DLL?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio (C++) 项目向导中添加/重命名配置?