7

前段时间看了一篇关于CLR的文章,作者展示了如果一个项目是在DEBUG模式下编译的,在每个操作符之前都会有一个NOP命令,这样就可以调试代码了。尽管如此,今天我发现我们也可以在发布模式下调试......请帮助理解差异。

4

3 回答 3

6

调试 .net 代码以便您可以在执行源代码时单步执行它通常需要三件事:

  • 与程序集 .dll 或 .exe 一起构建的符号(相关的 .pdb 文件)
  • (相关的.cs、.vb等文件)
  • 执行的机器代码必须未经优化

符号/debug:{full | pdbonly}标志。如果您指定/debug:full(即使在发布版本中,关闭编译器优化),您可以附加到已经运行的进程并逐步执行代码。如果您有/debug:pdbonly,那么您必须使用调试器来启动程序(并且在附加到已运行的进程时无法查看符号)。

优化/debug编译器选项精细控制,但可以由/optimize-进一步控制。

于 2012-06-15T16:03:49.637 回答
2

您可以在一定程度上在发布模式下进行调试。Debug 和 Release 只是简单的构建配置(您可以创建许多配置),真正的区别在于 Debug 配置不会优化生成的二进制代码(优化的代码使调试复杂化)。它还生成附加的调试数据,而发行版没有。

于 2012-06-15T16:03:32.523 回答
2

在发布模式下编译会优化生成的二进制文件,这使得调试器更难(但并非不可能)知道哪个二进制代码来自源代码的哪一行。

调试模式旨在使调试器更容易“跟随”,因此它使用 NOP 分隔代码行,并且不优化生成的二进制文件。

于 2012-06-15T16:09:22.120 回答