坑爹的-O2
最近在Linux系统开发程序,一直被一个问题困扰:
在单步调试程序时,程序总是莫名其妙地跳转,没走几步又跳回函数入口;或者干脆跳到一个莫名其妙的、不怎么相干的地方去。
这导致基本上没办法进行单步跟踪调试。一直以为是Linux开发环境太烂了,或者可能是多线程程序调试困难,因此不得不通过加入打印的方式进行调试,费时费力,很不爽。
今天看到一篇文章,讨论了gcc/g++的编译开关-O2,即著名的编译优化开关,传说中能改进程序速度的开关。引起我注意的是,这个开关会“优化”掉代码行的关系,会对代码组织方面进行优化。联想到我遇到的调试问题,不正是无法定位正确的代码行吗?因此检查配置文件,删除了所有的-O2开关,重新编译所有文件。
世界果然清净了!单步跟踪完全没问题,老老实实一步一步地运行!
关闭开关后编译的程序,比打开开关的程序没慢多少。从这个角度将,打开-O2开关实在有些得不偿失。整个程序的优化,还是应当依靠代码设计和实现的优化,通过编译器来优化,结果难以预料,而且优化效果也不明显。
2012-02-24 updated: qmake在debug版本中缺省不加-O2选项,而在release版本中会缺省加上-O2选项。