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

时间:2009-05-16 20:19:48

标签: c++ windows visual-studio windbg minidump

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

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

修改转储?还是修改pdb?在发货之前修改dll?

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

2 个答案:

答案 0 :(得分:12)

This post让我chkmatch。在已处理的dll上,chkmatch显示以下信息:

Executable:
TimeDateStamp: 4a086937
Debug info: 2 ( CodeView )
TimeStamp: 4a086937  Characteristics: 0  MajorVer: 0  MinorVer: 0
Size: 123  RVA: 00380460  FileOffset: 00380460
CodeView signature: sUar

Debug information file:
Format: PDB 7.00
Result: unmatched (reason: incompatible debug information formats)

对于预处理的dll使用相同的pdb,它会报告:

Executable:
TimeDateStamp: 4a086937
Debug info: 2 ( CodeView )
TimeStamp: 4a086937  Characteristics: 0  MajorVer: 0  MinorVer: 0
Size: 123  RVA: 00380460  FileOffset: 00380460
CodeView format: RSDS
Signature: (my guid)  Age: 19
PdbFile: (my path)

Debug information file:
Format: PDB 7.00
Signature: (my matching guid)  Age: 19

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

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

答案 1 :(得分:2)

Windbg中的

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