我有一个本地发布的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。