【问题标题】:Match source with disassembled code将源代码与反汇编代码匹配
【发布时间】:2014-04-19 19:04:44
【问题描述】:

作为我工作的一部分,我经常需要分析有/没有核心转储的不可重现的零售崩溃。我一般都配备

  1. 调用堆栈、崩溃时的注册表信息、信号信息
  2. 实际负载模块
  3. 匹配源代码

一般来说,基于偏移量并通过objdump生成反汇编,我计算出失败的指令(机器代码/汇编代码)。

下一个工作很乏味。我尝试将失败的指令映射到实际的源位置。这是耗时且痛苦的。有没有一种轻松、简单的方法可以将源代码映射到失败的指令?

我尝试使用 gcc -S 选项使用程序集源,但无法有效地映射源。我通常找不到一种合乎逻辑的方法来将程序集输出与源的崩溃偏移量映射。

请建议推荐的方法。

【问题讨论】:

  • 如何使用带有“-S”选项的objdump?
  • @Nick:没有调试信息也能正常工作吗?
  • 不,你必须在私人副本上启用它,就像 Jester 建议的那样。

标签: c++ linux debugging assembly g++


【解决方案1】:

在启用调试信息的情况下创建您的零售代码,然后在发货前将其剥离,但您自己保留。然后您可以使用您的副本来分析核心转储。

【讨论】:

  • 这个答案看起来很有希望,并且认为该方法有任何问题。我一定会尝试一下,看看结果如何。
  • @Jester 你能详细说明这个答案吗?我想更多地了解这一切应该如何完成。如何在发货前从二进制文件中剥离调试信息?如何使其在最终用户对等体中生成故障转储以及以后如何使用这些故障转储?你知道用调试信息编译时程序性能是否会下降吗?我只习惯用 GDB 调试。
【解决方案2】:

这里的关键是要有一个精确的版本系统(包括存储源代码的版本控制软件),这样你就可以拥有一个明确匹配的二进制和源代码对。这应该包括确切的编译器版本、编译器选项以及用于构建最终二进制文件的所有头文件和库代码。

现在,如果你有这个,你可以重新创建一个与客户正在运行的相同的构建,但带有调试信息,并在 gdb 中使用它来调试代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多