由于后期构建步骤,本地dll的符号(pdb)未加载

6
我有一个带符号的本地释放dll。有一个后期生成步骤来修改这个dll,该步骤会进行一些压缩和数据附加。然而,在后期构建步骤之后,pdb文件仍然有效,但WinDbg或Visual Studio 2008无法加载dll的符号。我们需要修改pdb文件或dll中的哪些位才能在加载引用我们发布的dll的转储时使WinDbg或Visual Studio加载符号?是文件大小重要吗?校验和还是哈希?时间戳?修改转储?还是修改pdb?在发货之前修改dll?(我们知道pdb是有效的,因为我们能够使用它手动获取调用堆栈中引用已发布的dll的地址的符号名称。但对于所有线程中调用堆栈中的每个地址手动完成这一过程非常繁琐。)
2个回答

12

这篇文章引导我去了chkmatch。在处理后的dll上,chkmatch显示了以下信息:

可执行文件:
TimeDateStamp: 4a086937
调试信息:2(CodeView)
时间戳:4a086937 特征:0 主版本号:0 次版本号:0
大小:123 RVA:00380460 文件偏移量:00380460
CodeView签名:sUar

调试信息文件:
格式:PDB 7.00
结果:不匹配(原因:不兼容的调试信息格式)

对于同一pdb文件和预处理的dll,它报告如下:

可执行文件:
TimeDateStamp: 4a086937
调试信息:2(CodeView)
时间戳:4a086937 特征:0 主版本号:0 次版本号:0
大小:123 RVA:00380460 文件偏移量:00380460
CodeView格式:RSDS
签名:(我的guid) 年龄:19
PdbFile:(我的路径)
调试信息文件: 格式:PDB 7.00 签名:(我的匹配guid) 年龄:19
我打开了两个dll的版本并跳转到偏移量00380460。在原始版本中,我清楚地看到了pdb的名称,但在处理后的版本中,该偏移量上没有pdb信息。我搜索了pdb路径并找到了完全相同的块-只是位于不同的偏移量处。然后我在原始dll中进行了二进制搜索,找到了相同偏移量处的字节“38 00 60 04”。在处理后的dll中查看相同的偏移量,我找到了相同的字节。所以我调整了RVA和偏移量(通过匹配字节找到)。终于成功了!现在chkmatch报告处理后的dll与原始版本完全相同的结果(除了我更改的RVA和FileOffset)。
编辑:确认,现在Visual Studio可以加载引用处理后的dll的转储的符号。

2
在Windbg中尝试使用.symopt +40,这将强制加载pdb文件。

尝试使用原始处理过的dll,但在这种情况下没有任何区别 - 我怀疑是因为在后期构建步骤之后RVA和FileOffsets都是错误的。 - sean e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接