【发布时间】:2012-06-18 17:32:21
【问题描述】:
前段时间我读过一篇关于CLR的文章,作者展示了如果一个项目是在DEBUG模式下编译的,在每个操作符之前都会有一个NOP命令,这样就可以调试代码了。尽管如此,今天我发现我们也可以在发布模式下调试...... 请帮助理解其中的区别。
【问题讨论】:
-
怎么样?我真的不知道如何在发布模式下调试
-
在发布模式下调试时遇到无法移动到其他组件
前段时间我读过一篇关于CLR的文章,作者展示了如果一个项目是在DEBUG模式下编译的,在每个操作符之前都会有一个NOP命令,这样就可以调试代码了。尽管如此,今天我发现我们也可以在发布模式下调试...... 请帮助理解其中的区别。
【问题讨论】:
您可以在一定程度上在发布模式下进行调试。 Debug 和 Release 只是简单的构建配置(您可以创建许多配置),真正的区别在于 Debug 配置不会优化生成的二进制代码(优化的代码使调试复杂化)。它还生成附加的调试数据,而发行版没有。
【讨论】:
调试 .net 代码以便您可以在执行源代码时单步执行它通常需要三件事:
符号由/debug:{full | pdbonly} 标志控制。如果您指定/debug:full(即使在发布版本中,关闭编译器优化),您可以附加到已经运行的进程并逐步执行代码。如果您有/debug:pdbonly,那么您必须使用调试器来启动程序(并且在附加到已运行的进程时无法查看符号)。
优化由/debug编译器选项精细控制,但可以由/optimize-进一步控制。
【讨论】:
在发布模式下编译会优化生成的二进制文件,这使得调试器更难(但并非不可能)知道哪个二进制代码来自源代码的哪一行。
调试模式旨在使调试器更容易“跟随”,因此它使用 NOP 分隔代码行,并且不优化生成的二进制文件。
【讨论】: