告诉C内联函数,但仍然可以调用调试器

时间:2018-10-07 16:34:32

标签: c gcc

总有没有将函数标记为内联函数,但是仍然可以在调试器中调用?我要调用的所有函数都标记为static inline,因为只允许在文件中公开某些函数。我正在使用gcc。

3 个答案:

答案 0 :(得分:1)

-ginline-points可以帮助您

  

为内联函数生成扩展调试信息。将位置视图跟踪标记插入到内联入口点,以便可以计算地址和视图编号并将其输出到调试信息中。可以独立于位置视图启用此功能,在这种情况下,将不会输出视图编号,但只能与语句边界一起启用,并且仅在启用位置视图的情况下默认启用。

答案 1 :(得分:1)

内联函数没有返回指令,因此,即使您具有内联函数的开始地址,从调试器中调用它也将执行内联后的代码,几乎当然没有合适的堆栈框架。

这并不常见,在任何情况下调试优化代码当然都不容易。通常情况下,只需将优化功能关闭即可进行调试-至少在GCC中,inline关键字在-O0被忽略。

答案 2 :(得分:0)

这是优化代码时的问题之一。您需要降低一些优化(例如,在CMake中,通常建议使用-O2而不是-O3),并将-fno-omit-frame-pointer添加到命令行中(这会使代码变慢,因为它将寄存器分配给在函数调用期间跟踪堆栈帧指针。

在像ICC这样的编译器上,您可以使用-debug all获得更多的调试信息。