6

我有一个用符号构建的本机发布 dll。有一个后期构建步骤可以修改 dll。后期构建步骤会进行一些压缩,并且可能会附加一些数据。pdb 文件仍然有效,但是 WinDbg 和 Visual Studio 2008 都不会在构建后步骤之后加载 dll 的符号。我们需要修改 pdb 文件或 dll 中的哪些位,以使 WinDbg 或 Visual Studio 在加载引用了我们的发布 dll 的转储时加载符号?

文件大小重要吗?校验和或哈希?时间戳?

修改转储?或修改pdb?发货前修改dll?

(我们知道 pdb 是有效的,因为我们能够使用它来手动获取引用已发布 dll 的转储调用堆栈中地址的符号名称。*ss 对调用堆栈中的每个地址手动执行它只是一个完全的痛苦所有线程。)

4

2 回答 2

12

这篇文章使我进入了chkmatch。在已处理的 dll 上,chkmatch 显示以下信息:

可执行文件:
时间日期戳:4a086937
调试信息:2 ( CodeView )
时间戳:4a086937 特征:0 MajorVer:0 MinorVer:0
大小:123 RVA:00380460 文件偏移:00380460
CodeView 签名:sUar

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

对预处理的 dll 使用相同的 pdb,它会报告以下内容:

可执行文件:
时间日期戳:4a086937
调试信息:2 ( CodeView )
时间戳:4a086937 特征:0 MajorVer:0 MinorVer:0
大小:123 RVA:00380460 文件偏移:00380460
CodeView 格式:RSDS
签名:(我的向导)年龄:19
PdbFile:(我的路径)

调试信息文件:
格式:PDB 7.00
签名:(我的匹配向导)年龄:19

我打开了两个版本的 dll 并转到偏移量 00380460。在原始版本中,很清楚我看到了 pdb 的名称,但在后处理版本中,该偏移量处没有 pdb 信息。我搜索了 pdb 路径并找到了完全相同的块 - 只是在不同的偏移量处。然后我对原始dll中的字节“38 00 60 04”进行了bin搜索。查看处理后的 dll 中的相同偏移量,我发现相同的字节。所以我调整了 RVA 和偏移量(通过匹配字节定位)。答对了!现在 chkmatch 报告已处理 dll 与原始文件完全相同的结果(除了我更改的 RVA 和 FileOffset)。

编辑:已确认,现在 Visual Studio 会加载引用已处理 dll 的转储符号。

于 2009-05-16T20:50:21.687 回答
2

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

于 2009-05-16T20:38:39.950 回答