调试优化代码
调试已优化的程序会出现特定的易用性问题。 优化可以更改操作顺序、添加或移除代码、更改变量数据位置以及执行其他变换,从而使生成的代码很难与原始源代码语句相关联。
例如:
- 数据位置问题
- 通过优化的程序,并不总是确定变量的最新值位于何处。 例如,如果当前值存储在寄存器中,那么内存中的值可能不是当前值。 大多数调试器无法遵循将商店除去到变量的操作,而对于调试器,它似乎从未更新过该变量,甚至可能从未设置过该变量。 这与未优化的情况形成对比,在此情况下,所有值都将清空回内存,并且调试可能更有效且更可用。
- 指令调度问题
- 通过优化的程序,编译器可能会对指令进行重新排序。 即,根据原始源代码中的行序列,可能无法按您期望的顺序执行指令。 此外,语句的指令序列可能不连续。 当您使用调试器单步执行程序时,程序可能显示为返回到代码中先前执行的行 (指令交错)。
- 合并变量值
- 优化可能会导致删除和合并变量。 例如,如果程序有两个表达式将相同的值分配给两个不同的变量,那么编译器可能会替换单个变量。 这可能会禁止调试易用性,因为程序员期望看到的变量在优化程序中不再可用。
您可以采用几种不同的方法来提高调试功能,同时优化程序:
- 首先调试非优化代码
- 首先调试程序的非优化版本,然后使用期望的优化选项对其进行重新编译。 请参阅 在存在优化的情况下进行调试 ,以了解在此方法中有用的一些编译器选项。
- 使用 -g 级别
- 使用 -g 级别子选项来控制可用的调试信息量。 增大它会提高调试功能,但会阻止某些优化。 有关更多信息,请参阅 -g。
使用 -qoptdebug
- 使用 -O3 优化级别或更高级别进行编译时,请使用编译器选项 -qoptdebug 来生成伪代码文件,以更准确地映射到指令和变量值在优化程序中的操作方式。 使用此选项,将程序装入调试器时,将调试优化程序的伪代码。 更多信息,请参阅使用-qoptdebug帮助调试优化后的程序。