【问题标题】:Is it possible to regenerate symbols for an exe?是否可以为 exe 重新生成符号?
【发布时间】:2011-05-27 00:01:42
【问题描述】:

我的一位同事向客户发送了一个热修复版本,随后删除了 pdb 文件。有问题的构建正在崩溃(间歇性地),我们有几个崩溃转储。我们拥有版本控制中的所有源代码,并且可以将其编译为等效的 .exe 并获取该文件的符号。但是,这些符号与故障转储不完全匹配。似乎有几个函数偏离了一些恒定的偏移量,但我们只查看了少数几个。

我希望能够执行以下操作(我可以手动伪造其中的一部分,但这是一项巨大的工作):为转储中的每个线程获取堆栈跟踪并将转储中的指针转换为适当的类型并让它们显示在 Visual Studio 调试器中。我正在使用 2005,如果这很重要的话。

是否有工具可以让我们根据源代码、所有 .obj 文件和原始 .exe 重新创建 pdb?或者当我们编译/链接时是否有设置说“让它与你刚刚做的其他 exe 完全一样”或类似的东西?

快速更新,基于到目前为止的答案:我有我们发送给客户的 exe 文件,而不是对应的 pdb,如果有帮助的话。我不会尽快向他们发送新版本(如果可能的话),因为它需要大约一周的运行时间才能获得故障转储,而客户已经在“为什么这还没有修复?”阶段。 (如果我们确实发送了另一个构建,我希望它能够修复问题或在感兴趣的领域进行额外的调试,而不仅仅是相同的代码。)我知道可以使用大量的猜测;这就是我们目前正在做的事情。但这很痛苦,所以我希望有一种方法可以自动化它。

【问题讨论】:

标签: c++ visual-studio compiler-construction linker


【解决方案1】:

您无法重新创建 PDB 以匹配预先存在的可执行文件。 PDB 包含一个“指纹”,对于每个编译都是唯一的。除非你能让旧的 PDB 神奇地重新出现,否则你应该在脑后敲你的牛人(Gibbs 风格,如果你看 NCIS),重新编译整个东西,将 PDB 存储在安全的地方,然后发布一个新的可执行文件给您的客户,然后让崩溃发生。

【讨论】:

  • O.o... 这真是一团糟。听起来 Windows 是一个很难从中重新生成相同工件的世界,嗯?
  • 它与 Windows 本身没有任何关系。这是一个 Visual Studio 的东西。我想你可以在没有 PDB 的情况下进行一些事后调试(如果你有链接器映射等),但这非常困难。需要很多巫毒技能。 :)
  • 有趣。我想这是尽可能使用类 UNIX 系统的另一个原因。恕我直言,必须能够精确地重新生成二进制工件(也就是说,构建必须是完全可重复的),否则很难可靠地调试问题......
【解决方案2】:

如果您的构建系统允许您根据历史记录中的任何修订重新创建任何二进制文件,那么您应该能够从客户那里获取构建 ID,并重新生成相同的确切构建 ID,以及所有二进制文件和等等。当然,如果您有一个大型项目,这将需要一段时间,但它也会产生您需要的调试文件。

如果您无法执行构建的精确复制,那么看看这种情况,认真考虑可能会出现的其他一些问题,然后开始移动以使重新生成所有成功的构建和相关文件成为可能项目的历史。这将使将来能够更轻松地解决此类问题。

【讨论】:

    【解决方案3】:

    当你有源代码时,很容易找到它们与 exe 文件之间的对应关系。只需要求他们将 exe 文件连同崩溃日志一起发送给您并使用 IDA。

    考虑到您需要它“仅用于一次”,您所问的比这要困难得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多