几何尺寸与公差论坛

 找回密码
 注册
查看: 1521|回复: 0

如何:调试优化的代码

[复制链接]
发表于 2013-11-21 13:31:43 | 显示全部楼层 |阅读模式
http://msdn.microsoft.com/zh-cn/ ... s%28v=vs.90%29.aspx
当编译器优化代码时,它将重新定位并重组指令,以得到更高效的编译的代码。由于这种调整,调试器并不总能确定与一组指令对应的源代码。

优化可能影响到:


  • 本地变量(可被优化器移除或移动到调试器无法识别的位置)。

  • 函数内部的位置(当优化器合并代码块时发生变化的位置)。

  • 调用堆栈上框架的函数名称(如果优化器合并两个函数,则函数名称可能是错误的)。

但是,假定所有框架都有符号,则在调用堆栈上看到的框架几乎总是正确的。在下列情况下调用堆栈上的框架将是错误的:有堆栈损坏,有用汇编语言编写的函数,或者有操作系统框架在调用堆栈上没有匹配的符号。

全局和静态变量总是正确显示。结构布局也是这样。如果您有指向结构的指针而且指针的值是正确的,那么结构的每个成员变量都将显示正确值。

出于这些限制原因,只要有可能,就应使用程序的“未优化”版本进行调试。默认情况下,优化在 Visual C++ 程序的“Debug”配置中关闭,在“Release”配置中打开。

但有时,bug 可能仅在程序的优化版本中出现。在此情况下,必须调试优化的代码。

在“Debug”生成配置中打开优化


  • 创建新项目时,请选择 Win32 Debug目标。接下来要一直使用 Win32Debug目标,直至程序已进行全面调试,可以生成 Win32 Release目标为止。调试器并不优化 Win32 Debug目标。

  • 在解决方案资源管理器中选择项目。

  • 在“视图”菜单上单击“属性页”。

  • 在“属性页”对话框中,确保在“配置”下拉列表框中选择了“Debug”。

  • 在左边的文件夹视图中,选择 C/C++ 文件夹。

  • 在“C++”文件夹下选择“Optimization”。

  • 在右边的属性列表中找到“Optimization”。它旁边的设置可能显示为“Disabled (/Od)”。选择其他选项(“Minimum Size(/O1)”、“Maximum Speed(/O2)”、“Full Optimization(/Ox)”或“Custom”)之一。

  • 如果为“Optimization”选择了“Custom”选项,现在便可为属性列表中显示的其他任何属性设置选项。

调试优化的代码时,请查看“反汇编”窗口以了解实际创建和执行了哪些指令。设置断点时,需要注意断点可能随指令一起移动。例如,考虑以下代码:

                    
                                                         
         
                      for (x=0; x<10; x++)
                     
     

假定在该行设置了一个断点。可能希望该断点被命中 10 次,但如果代码进行了优化,则只会命中该断点一次。其原因在于第一条指令将 x 的值设置为 0。编译器认定该指令只需执行一次,将其移出循环。断点随之移动。

而比较和递增 x 的指令仍留在循环内。当查看“反汇编”窗口时,“单步执行单元”自动设置为“指令”以允许更大控制,这在逐句通过优化的代码时很有用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-5-7 01:30 , Processed in 0.112929 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表