【问题标题】:Symbols (pdb) for native dll are not loaded due to post build step由于后期构建步骤,未加载本机 dll 的符号 (pdb)
【发布时间】:2023-04-07 09:37:01
【问题描述】:

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

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

修改转储?或修改pdb?发货前修改dll?

(我们知道 pdb 是有效的,因为我们能够使用它来手动获取引用已发布 dll 的转储调用堆栈中地址的符号名称。*ss 对所有线程中的调用堆栈。)

【问题讨论】:

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


    【解决方案1】:

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

    可执行文件: 时间日期戳:4a086937 调试信息:2 ( CodeView ) 时间戳:4a086937 特征:0 MajorVer:0 MinorVer:0 大小:123 RVA:00380460 文件偏移:00380460 CodeView 签名:sUar 调试信息文件: 格式:PDB 7.00 结果:不匹配(原因:调试信息格式不兼容)

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

    可执行文件: 时间日期戳:4a086937 调试信息:2 ( CodeView ) 时间戳:4a086937 特征:0 MajorVer:0 MinorVer:0 大小:123 RVA:00380460 文件偏移:00380460 CodeView 格式:RSDS 签名:(我的向导)年龄:19 PdbFile:(我的路径) 调试信息文件: 格式:PDB 7.00 签名:(我的匹配向导)年龄:19

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 尝试使用原始处理的 dll,但在这种情况下没有任何区别 - 我怀疑是因为 RVA 和 FileOffsets 在构建后步骤之后完全错误。
      猜你喜欢
      • 2011-03-20
      • 2012-07-20
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2019-08-09
      • 2019-05-01
      • 1970-01-01
      • 2018-11-09
      相关资源
      最近更新 更多