我有一个用符号构建的本机版本dll。有一个修改dll的post构建步骤。 post构建步骤会进行一些压缩,并可能附加一些数据。 pdb文件仍然有效,但是在构建后步骤之后,WinDbg和Visual Studio 2008都不会加载dll的符号。我们需要修改pdb文件或dll中的哪些位以使WinDbg或Visual Studio在加载我们的版本dll被引用的转储时加载符号?
文件大小是否重要?校验和或哈希?时间戳?
修改转储?还是修改pdb?在发货之前修改dll?
(我们知道pdb是有效的,因为我们可以使用它来手动获取引用已发布的dll的转储调用堆栈中地址的符号名称。这只是* ss中的一个完全痛苦的事情。所有线程中的一个callstack。)
答案 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)
尝试使用.symopt +40,这将强制加载pdb。