我们的夜间构建过程被破坏了很长一段时间,因此它生成的 PDB 文件与相应的图像文件的年龄相差几个小时。我已经解决了这个问题。
但是,我想开始使用符号服务器,但由于必须使用这些年龄不匹配的 pdb 文件而无法开始。我通过使用 Windbg 中的 .symopt +0x40 方法解决了这个问题。这意味着我必须手动组织我的所有 pdb 文件,并且经过多年的发布,这一点加起来。
我正在寻找一种方法来修改 Windbg 用于标记 pdb 年龄的机制,并强制它与我的图像文件匹配。实用性ChkMatch http://www.debuginfo.com/tools/chkmatch.html做了类似的事情,但是对于 pdb 签名。开发人员在页面上声明“如果可执行文件和 PDB 文件具有不同的签名但年龄相同,则 ChkMatch 能够使它们匹配(有关 PDB 签名和年龄的更多信息,请参阅本文)。如果年龄不同,该工具无法匹配文件匹配。”
我查看了一个十六进制编辑器的内部,甚至发现了看起来像与年龄相对应的位,但它必须在内部引入更多的技巧,因为我无法让它工作。
有任何想法吗?
EDIT:
我不知道这是否有帮助,但在我的特殊情况下,年龄差异是由不必要的重新链接 dll 引起的,这也会重新创建 PDB 文件。但是,我们的构建过程是存储原始 dll(重新链接之前)和重新链接之后的 pdb。我考虑过以某种方式手动重现这样的情况。意思是,强制重新链接 DLL,但在这两种情况下都保存 pdb。然后我可以对两个文件进行二进制比较,看看它们是如何变化的。也许运行某种自动执行此操作的修补软件?通过查看我的控制案例中到底发生了什么变化,也许我可以对公司构建过程中保存的 DLL 和 PDB 执行相同的操作?
EDIT:
我想到了!!!!感谢第一个答案的评论,我查看了《未记录的 Windows 2000 秘密:程序员手册》一书的 pdf 链接。作者详细介绍了 pdb 文件格式。正如我之前所说,我已经将 pdb 加载到十六进制编辑器中,并翻转了一些位,看起来我使年龄/签名匹配,但它不起作用。好吧,在使用 W2k 秘密书中的实用程序将 pdb“分解”到包含的流中之后,我发现它们隐藏了对流 3 中年龄的另一个引用!!!!!!!!!当我也翻转那个时,它在windbg中匹配。这是巨大的!!!!非常感谢...符号服务器我来了!
Windbg 不会修改 pdb 的年龄 - 它只会查找它以匹配可执行文件的年龄 - 编译器在(重新)生成可执行文件和调试文件时会修改它。
现在,根据 debuginfo.com 文章,到达正确的调试目录(类型为 Codeview)、将其与 PDB7 签名进行匹配并对可执行文件内的 Age 或 GUID 进行修改并不困难。为什么这不是一个选择?
我想,你想更新 pdb 吗?恐怕 pdb 是一种专有格式。有多个只读 API(dbghelp.dll 和 dia sdk),但就修改而言,您需要猜测细节才能修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)