8

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

Cannot evaluate function -- may be inlined

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

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

4

2 回答 2

9

让编译器生成内联函数的可调用版本的一种方法是包含获取函数地址的代码。您还可以选择一个选项gcc。来自关于内联函数的 gcc 文档:</p>

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

于 2014-02-26T02:16:27.193 回答
1

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

根据GDB 文档中的11.1 内联函数:

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

另请参阅3.9 调试程序或 GCC 的选项

于 2014-02-26T01:55:10.527 回答