在调试模式下编译软件时,我们的项目刚开始使用-Og标志,而不是-g3标志。
男子GCC说:“ - Og优化调试体验。-Og支持不干扰调试的优化。它应该是标准编辑 - 编译 - 调试周期的优化级别,提供合理的优化级别,同时保持快速编译和良好的调试经验。“
问题是由内联调用设置的任何变量都是“优化的”,因此您不能使用变量执行“break if”命令或打印变量,直到其中任何一个被某些东西重置(不是内联函数)或直到变量向上或向下传递到一个新函数(然后你可以看到值等)我已经阅读了GCC手册页,但我没有看到任何关于这个问题或如何修复它除了回到-g3标志进行调试之外,不要使用-Og标志。那么在某种程度上使用-Og并且仍然可以在内联设置之后看到变量吗?
编译器是RH 7.3 OS的gcc版本4.8.5 20150623(Red Hat 4.8.5-11)(GCC),我们使用ddd作为GUI。
这是pid优化的非内联示例:
C单位得到pid检查。
pid = et->printPid(); <= optimized out, can't set break if using pid
if( pid > 0 ) <= optimized out, can do a break if
{
pid = waitpid( pid, &status, WNOHANG ); <= now you can "see" the pid setting and add break if
if( pid == -1 )
FuEvEventTable.h
pid_t printPid() { return( myPrintPid ); }
如果printPid是内联的(通常我们想要在类中返回或设置变量)同样的事情会发生,所以{return(myPrintPid);风格可能是问题。