优化代码调试

只有在优化期间才会显示的问题通常指示由优化暴露出来的逻辑错误或编译错误,例如,使用尚未初始化的变量。如果您在程序中遇到了只在优化版本中出现的错误,则通常可以通过使用二进制搜索技术查找出现故障的模块来找出发生错误的原因:

  1. 通过优化一半模块开始,了解是否仍然存在错误。
  2. 在每次更改优化的模块数之后,如果错误仍然存在,则优化更少的模块。如果错误消失,则优化更多模块。最终,您将把错误范围缩小到单个模块或少量模块。
  3. 调试出现故障的模块。如果可能的话,关闭该模块的指令调度优化。找出问题,例如,在写入变量之前就从变量中读取,指针或数组索引超过了为指针或数组分配的存储器的限制。

当调试已优化的代码时,调试器视图中的信息可能会导致您怀疑发生了实际上不存在的逻辑问题。请考虑以下几点:

局部变量通常不正确

不要依赖变量视图来显示变量的当前值。数值、字符值和指针可能保留在处理器寄存器中。在已优化的程序中,这些值和指针并不会始终写出到内存中;在某些情况下,可能会因为不需要它们而废弃它们。

静态变量和外部变量并不始终是最新的

在已优化的函数中,静态变量或外部变量的值并不始终写出到内存中。但是,静态变量在函数入口点/出口点中通常是正确的。

“寄存器”和“内存”视图始终是最新的

寄存器内存视图是正确的。与显示实际变量的监视器(例如,变量视图)不同,自从上次停止执行以来,寄存器内存视图始终是最新的。

源代码语句可能已被优化掉

当使用反汇编视图或混合视图来查看程序的机器代码时,您可能会发现,例如,在源代码中对变量的赋值不会导致生成任何反汇编代码 - 这可能指示在赋值之后从未使用该变量的值。

不会始终保持源代码语句顺序

许多优化操作将导致对生成的代码进行重新排序。对生成的代码进行重新排序之后,不会保持源代码语句顺序。

相关任务
编译程序以进行调试
使用条款 | 反馈
(C) Copyright IBM Corporation 2001, 2005. All Rights Reserved.