是否可以为exe重新生成符号?

时间:2010-12-17 07:54:33

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

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

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

是否有工具让我们在给定源代码,所有.obj文件和原始.exe的情况下重新创建pdb?或者,当我们编译/链接说“使它完全像你刚才做的其他exe”或类似的东西时,是否有设置?

根据目前为止的答案进行快速更新:我有我们发送给客户的exe文件,而不是与之对应的pdb,如果有帮助的话。我很快就不会向他们发送新版本(如果可能的话),因为它需要大约一周的时间才能获得崩溃转储,而客户已经在“为什么这不是已经修复了?”阶段。 (如果我们确实发送了另一个版本,我希望它能够解决问题,或者在感兴趣的区域进行额外的调试,而不仅仅是相同的代码。)我知道可以手动执行一些操作。很多猜测;这就是我们目前正在做的事情。但这很痛苦,所以我希望有一种自动化的方法。

3 个答案:

答案 0 :(得分:1)

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

如果你无法对构建进行精确的再现,那么请看一下这种情况,仔细思考可能会出现的其他一些内容,然后开始移动,以便重新生成所有成功的构建和相关文件。项目的历史。这将使很多更容易在将来解决这样的问题。

答案 1 :(得分:0)

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

你所要求的要比那更困难,同时考虑到你只需“一次性使用”。

答案 2 :(得分:0)

您无法重新创建PDB以匹配预先存在的可执行文件。 PDB包含一个“指纹”,每个编译都是唯一的。除非你可以让旧的PDB神奇地重新出现,否则你应该在脑后击打你的牛犊(Gibbs式,如果你看NCIS),重新编译整个东西,将PDB存放在安全的地方,并运送新的可执行文件给你的顾客,让崩溃来了。