C++ 可以在gdb中调用内联函数和/或使用GCC发出它们吗?

C++ 可以在gdb中调用内联函数和/或使用GCC发出它们吗?,c++,c,debugging,gdb,inline-functions,C++,C,Debugging,Gdb,Inline Functions,我们都知道内联函数会使调试变得更加棘手,因为它们可以从堆栈跟踪中删除。但是假设我想从gdb中调用内联函数,并且我知道它的名称和参数。我想我应该能做到,但我明白了: Cannot evaluate function -- may be inlined 我使用nm列出了我正在使用的共享库中的符号,发现我想要调用的函数不在其中。没什么大不了的。我想要的是一种生成这些内联函数的可见定义的方法。我可以访问当前包含内联定义的头文件,但我不能真正修改这些头文件。也许有什么方法可以告诉编译器发出它在翻译单元中

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

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


我在Linux上使用GCC4.7.2和GDB7.5.1。而且我不能真正切换到非优化的构建,因为我正在调试生产中的核心转储(在开发中,我只需关闭优化,事情就会更简单)。

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

根据GDB文件中的规定:

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


另请参见

让编译器生成内联函数的可调用版本的一种方法是包含获取函数地址的代码。您还可以为
gcc
提供一个选项。发件人:

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


我想保留很多内联函数,所以不想显式地获取每个函数的地址。所以我非常喜欢你的
gcc-fkeep内联函数
建议。而且它有效!但另一方面,它使我的可执行文件增加了50%(可见符号的数量增加了200%)。如果有一种方法可以指定一个目录或一组文件来应用keep内联线,而忽略其余的内容,那就太好了。但这可能要求太多了?您的构建系统应该能够帮助您做到这一点。使用
make
,每个目录
Makefile
可以有类似于
CFLAGS+=-fkeep内联函数的功能。对不起,我的意思是我想保留目录X中包含的内联线,但在其余的目录中省略它们(例如/usr/include和其他)。