【问题标题】:Dump debug_loc section from executable从可执行文件中转储 debug_loc 部分
【发布时间】:2015-02-11 07:00:58
【问题描述】:

如果在编译 C 文件时向 GCC 提供了默认选项 (-g),我如何从 Linux 上的可执行文件中转储 debug_loc 部分?我使用readelf linux 实用程序。

GCC 默认生成 DWARF4 格式的 DWARF 信息,所以如果我通过 -g-dwarf2 我可以看到 .debug_loc 部分,但是如果使用默认选项生成信息,如何检查该部分,因为我在转储中看不到该部分?

【问题讨论】:

  • 您使用的是最新版本的 binutils 吗?在 Ubuntu 14.04 上,我可以使用“gcc -g test.c -o test”构建可执行文件。然后执行“readelf --debug-dump=info test”并查看它是 DWARF 4,然后执行 readelf --debug-dump=decodedline test 并获取 .debug_line 部分的内容。
  • 哦,我不知道这个选项。请对此进行更多解释并回答我会接受的,非常感谢!

标签: linux gcc gdb dwarf


【解决方案1】:

您是否使用最新版本的 binutils?在 Ubuntu 14.04 上,我可以使用“gcc -g test.c -o test”构建可执行文件。

通过“readelf --debug-dump=info test”,我可以确认它使用的是 DWARF 4。

之后,您(至少)有两种方法可以转储 .debug_line 部分的内容。

readelf --debug-dump=decodedline 测试

这将转储解码的行号信息。您可以直接获得 line==address 映射。

还有:

readelf --debug-dump=rawline 测试

这将为您获取原始的 debug_line 内容。

【讨论】:

  • 等一下。这是给我 debug_line 部分的内容,而不是 debug_loc?有什么联系/区别?
  • 对不起。我的错。我以为你在寻找 debug_line 部分。使用 --debug-dump=loc 获取 .debug_loc。
  • 仅供参考:对于简单的可执行文件(一个函数),由于某种原因,这不会生成 debug_loc 部分。对于更复杂的,它确实如此。好笑。
  • 我在 dwarf 4 中没有看到 .debug_loc(我可以在 dwarf 2 中找到它,相同的代码)。有什么原因吗?
【解决方案2】:

通常会为优化代码生成 .debug_loc。尝试使用编译器标志优化您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多