总有没有将函数标记为内联函数,但是仍然可以在调试器中调用?我要调用的所有函数都标记为static inline
,因为只允许在文件中公开某些函数。我正在使用gcc。
答案 0 :(得分:1)
-ginline-points
可以帮助您
为内联函数生成扩展调试信息。将位置视图跟踪标记插入到内联入口点,以便可以计算地址和视图编号并将其输出到调试信息中。可以独立于位置视图启用此功能,在这种情况下,将不会输出视图编号,但只能与语句边界一起启用,并且仅在启用位置视图的情况下默认启用。
答案 1 :(得分:1)
内联函数没有返回指令,因此,即使您具有内联函数的开始地址,从调试器中调用它也将执行内联后的代码,几乎当然没有合适的堆栈框架。
这并不常见,在任何情况下调试优化代码当然都不容易。通常情况下,只需将优化功能关闭即可进行调试-至少在GCC中,inline
关键字在-O0
被忽略。
答案 2 :(得分:0)
这是优化代码时的问题之一。您需要降低一些优化(例如,在CMake中,通常建议使用-O2而不是-O3),并将-fno-omit-frame-pointer
添加到命令行中(这会使代码变慢,因为它将寄存器分配给在函数调用期间跟踪堆栈帧指针。
在像ICC这样的编译器上,您可以使用-debug all
获得更多的调试信息。