【问题标题】:Possible to call inline functions in gdb and/or emit them using GCC?可以在 gdb 中调用内联函数和/或使用 GCC 发出它们吗?
【发布时间】:2014-03-28 14:22:41
【问题描述】:

我们都知道内联函数会使调试变得更加棘手,因为它们可以从堆栈跟踪等中省略。但是假设我想从 gdb 中调用一个内联函数,并且我知道它的名称和参数。我想我应该能够做到这一点,但我明白了:

Cannot evaluate function -- may be inlined

我用nm列出了我正在使用的共享库中的符号,发现我要调用的函数不在里面。没什么大惊喜。我想要的是一种生成这些内联函数的可见定义的方法。我可以访问当前包含内联定义的头文件,但我无法真正修改这些头文件。也许有某种方法可以告诉编译器发出它在翻译单元中看到的所有内联函数的定义?或者其他一些可以更轻松地调用和检查 gdb 中内联函数结果的技巧?

我在 Linux 上使用 GCC 4.7.2 和 GDB 7.5.1。而且我不能真正切换到未优化的构建,因为我正在调试生产中的核心转储(在开发中我会关闭优化,然后事情就更容易了)。

【问题讨论】:

标签: c++ c debugging gdb inline-functions


【解决方案1】:

让编译器生成内联函数的可调用版本的一种方法是包含获取函数地址的代码。您还可以选择给gcc。来自the gcc documentation on inline functions

当一个函数既是内联函数又是静态函数时,如果对该函数的所有调用都是 集成到调用者中,并且从不使用函数的地址,则 函数自己的汇编代码永远不会被引用。在这种情况下,GCC 不 实际上输出函数的汇编代码,除非你指定 选项 -fkeep-inline-functions.

【讨论】:

  • 我有很多想要保留的内联函数,所以不想显式地获取每个函数的地址。所以我非常喜欢你的gcc -fkeep-inline-functions 建议。它有效!但另一方面,它使我的可执行文件增大了 50%(可见符号的数量增加了 200%)。如果有一种方法可以指定一个目录或一组文件来应用 keep-inlines 并省略其余部分,那就太好了。但这可能问得太多了?
  • 您的构建系统应该能够提供帮助。使用make,每个目录Makefile 可以有类似CFLAGS += -fkeep-inline-functions
  • 对不起,我的意思是我想在目录 X 中保留 #includes 的内联,但在其余部分省略它们(例如 /usr/include 和其余部分)。
【解决方案2】:

在这种情况下,使用 GCC 选项 -gdwarf-2 构建您的项目可能会有所帮助。

根据 GDB 文档中的11.1 Inline Functions

为了让 gdb 支持内联函数,编译器必须在调试信息中记录有关内联的信息——使用 dwarf 2 格式的 gcc 会这样做,其他几个编译器也这样做。 gdb 仅在使用 dwarf 2 时支持内联函数。4.1 之前的 gcc 版本不会发出两个必需的属性(“DW_AT_call_file”和“DW_AT_call_line”); gdb 不显示早期版本的 gcc 的内联函数调用。而是将内联函数的参数和局部变量显示为调用者中的局部变量。

另见3.9 Options for Debugging Your Program or GCC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 2013-02-04
    • 2017-10-24
    • 2023-01-04
    • 1970-01-01
    • 2013-03-28
    • 2011-12-20
    • 2014-03-14
    相关资源
    最近更新 更多