最重要的是,在调试模式下没有优化,而在发布模式下则有优化.这很重要,因为编译器非常先进,可以对代码进行一些非常棘手的低级改进.因此,您的代码中的某些行可能会在没有任何指令的情况下离开,或者某些行可能会混淆.逐步调试是不可能的.此外,局部变量通常以神秘的方式进行优化,因此Watches和QuickWatches通常不起作用,因为变量是"优化掉的".并且还有许多其他优化.尝试调试优化的.NET代码,你会看到.
另一个关键区别在于,因此默认的Release设置不会产生大量的调试符号信息.这是您可能已经注意到的.PDB文件,它允许调试器确定哪些汇编指令与哪行代码相对应,等等.
最重要的是,在调试模式下没有优化,而在发布模式下则有优化.这很重要,因为编译器非常先进,可以对代码进行一些非常棘手的低级改进.因此,您的代码中的某些行可能会在没有任何指令的情况下离开,或者某些行可能会混淆.逐步调试是不可能的.此外,局部变量通常以神秘的方式进行优化,因此Watches和QuickWatches通常不起作用,因为变量是"优化掉的".并且还有许多其他优化.尝试调试优化的.NET代码,你会看到.
另一个关键区别在于,因此默认的Release设置不会产生大量的调试符号信息.这是您可能已经注意到的.PDB文件,它允许调试器确定哪些汇编指令与哪行代码相对应,等等.
"Debug"和"Release"实际上只是可以影响构建和调试的一系列设置的两个标签.
在"调试"模式下,您通常具有以下内容:
程序调试数据库文件,允许您在运行时在源中非常密切地执行程序.
关闭所有优化,允许您检查变量的值并跟踪可能已经优化或内联的函数
一个_DEBUG预处理器定义,允许您编写与调试模式相比在调试模式下行为不同的代码,例如,用于仅在调试时使用的仪器ASSERT
链接到已经使用调试选项编译的库,这些库通常不会部署到实际客户(出于大小和安全性的原因)
在"释放"模式下,将启用优化(尽管有多个可用选项),并且未定义_DEBUG预处理器定义.通常,您仍然希望生成PDB文件,因为当事情运行得更快时能够在发布模式下"调试"非常有用.
大多数情况下,调试包含许多在调试时有用的额外信息.在发布模式下,这一切都被削减并交易以获得性能.
如果您通过项目编译选项并进行比较,您会看到有什么不同.
假设问题是关于本机/ C++代码(从措词中不完全清楚):
基本上,在Debug中,所有代码生成优化都是关闭的.某些库(例如STL)默认为更严格的错误检查(例如,调试迭代器).生成更多调试信息(例如,"编辑并继续").在代码中生成更多东西来捕获错误(局部变量值设置为未初始化模式,使用调试堆).
值得一提的是,非常明显的是,构建标志允许使用不同的逻辑,这些逻辑应仅用于更改日志记录和"控制台"消息传递,但可以被滥用并且不仅可以显着改变低级别,而且可以显着改变实际的业务逻辑.
另请注意,例如,在使用MFC时,调试项目链接到不可再MFC90D.DLL
发行的DLL版本,例如发布构建链接与可再发行版本之类的链接MFC90.DLL
.这可能与其他框架类似.
因此,您可能无法在非开发计算机上运行调试构建应用程序.
另外,显然,Debug模式会创建许多额外的线程来帮助调试.无论是否附加调试器,它们在整个过程中都保持活动状态.在这里查看我的相关问题.