代码之家  ›  专栏  ›  技术社区  ›  sean e

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

  •  6
  • sean e  · 技术社区  · 15 年前

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

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

    修改转储?或者修改PDB?是否在发送前修改DLL?

    (我们知道pdb是有效的,因为我们可以使用它来手动获取dump调用堆栈中引用释放的dll的地址的符号名。对于所有线程中的调用堆栈中的每个地址,*s s都要手工完成,这只是一个总的痛苦。)

    2 回复  |  直到 15 年前
        1
  •  12
  •   Community M-A    7 年前

    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路径,发现了完全相同的块-只是在不同的偏移量。然后我在bin中搜索原始dll中的字节“38 00 60 04”。在处理的dll中查看相同的偏移量时,我发现了相同的字节。所以我调整了RVA和偏移量(通过匹配字节来定位)。答对了!现在,chkmatch报告处理的dll与原始dll的结果完全相同(除了我更改的rva和fileoffset)。

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

        2
  •  2
  •   sean e    14 年前

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