优化影响了那些内容
局部变量
这里提到的局部变量包含一个 block 中定义的局部变量以及参数传递中使用的局部变量。 这些局部变量可能会经历从栈里面分配到使用寄存器到直接移除的过程。这些局部变量都只是临时保存中间的计算结果,可以直接优化掉,则调试时不能看到局部变量的值。
函数中的语句的位置
写代码的时候通常会认为执行的逻辑是按照预定的排布依次执行的,可优化可能会对语句的位置进行调整,甚至将一些语句与其它的语句进行合并,这样在调试时可能会有跳前跳后的现象。
函数调用关系
优化可能会消除一些函数调用关系,编译器可能会将小函数直接展开,多个函数之间可能会合并栈帧,这样你在调试时可能会看到一个奇怪的函数名称。
优化影响调试的根本原因
调试信息是在优化之前生成的。由于优化过程中可能对程序进行了调整,这将导致调试信息与执行代码不一致,调试信息部分失效。
GCC 中一些会导致调试信息无效的情况
常规表达式的删除,如将多个实例合并为一个实例
固定不变代码的移动。如将循环中并不会改变的表达式移动到循环开始处
指令重排
移动指令以使加载和存储与其它代码部分重叠。将计算得到的值的过程向值的使用位置靠近。赋值语句可能并不会立刻执行,当需要用到值的时候可能会跳回去执行。
大的跳跃
不同的代码块被合并造成的结果。一些以 goto、return、break 这些跳转语句结束的序列容易产生这种现象
不固定的变量——变量的值不可预测
赋值语句被移动,寄存器复用,值传递过程中变量被忽略等都可能造成这个问题
更详细的说明详见 Debugging Optimezed Code。
优化问题的一些解决方法