原生dll的符号(pdb)不会由于生成后步骤而被加载

我有一个本地发布的DLL是用符号构build的。 有一个后修build的步骤,修改DLL。 后build立步骤做了一些压缩,可能附加一些数据。 该pdb文件仍然有效,但WinDbg和Visual Studio 2008都不会在后构build步骤后加载DLL的符号。 我们需要修改pdb文件或dll中的哪些位以获取WinDbg或Visual Studio加载符号的时间,以便在其中引用我们的发行版dll的转储?

这是重要的文件大小? 校验和还是散列? 时间戳?

修改转储? 或者修改pdb? 在发货之前修改dll?

(我们知道pdb是有效的,因为我们可以使用它来手动获取引用释放的dll的转储调用堆栈中的地址的符号名称,这只是* ss中的一个棘手的问题,对于callstack中的每个地址所有的线程。)

这篇文章让我想起了chkmatch 。 在处理的DLL上,chkmatch显示这个信息:

可执行文件:
 TimeDateStamp:4a086937
调试信息:2(CodeView)
时间戳:4a086937特征:0重要更改:0次更新:0
大小:123 RVA:00380460 FileOffset:00380460
 CodeView签名:sUar

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

与预处理的dll相同的pdb,它会报告这一点:

可执行文件:
 TimeDateStamp:4a086937
调试信息:2(CodeView)
时间戳:4a086937特征:0重要更改:0次更新:0
大小:123 RVA:00380460 FileOffset: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的转储的符号。

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