调试重命名的 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 ”查看它并搜索调试目录输出。由于您的 DLL 中指向 PDB 符号的路径不再匹配,因此无法加载这些符号。尝试 !sym noise 看看是否有其他选项尝试匹配/加载符号。 【参考方案1】:

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?的主要内容,如果未能解决你的问题,请参考以下文章

文件路径乱码,无法打开、重命名、移动、删除、粉碎

重命名项目会导致 med 代码签名错误

在解决方案资源管理器中重命名 .cs 属性的问题

如何在 Visual Studio (C++) 项目向导中添加/重命名配置?

Android Studio 4.2 开始在发布版本中重命名 APK 内的资源

如何利用python重命名一个文件名