以发布模式在.NET中调试

以发布模式在.NET中调试,.net,debugging,clr,cil,.net,Debugging,Clr,Cil,不久前,我读了一篇关于CLR的文章,作者在文章中指出,如果项目是在调试模式下编译的,那么在每个操作符发出NOP命令之前,就可以调试代码。然而,今天我发现我们也可以在发布模式下调试。。。 请帮助理解差异。您可以在一定程度上在发布模式下进行调试。调试和发布只是构建配置(您可以创建许多),真正的区别在于调试配置不会优化生成的二进制代码(优化的代码使调试复杂化)。它还生成发行版未生成的其他调试数据 调试.net代码,以便您在执行源代码时逐步了解源代码,通常需要三件事: 与assembly.dll或.e

不久前,我读了一篇关于CLR的文章,作者在文章中指出,如果项目是在调试模式下编译的,那么在每个操作符发出NOP命令之前,就可以调试代码。然而,今天我发现我们也可以在发布模式下调试。。。
请帮助理解差异。

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

调试.net代码,以便您在执行源代码时逐步了解源代码,通常需要三件事:

  • 与assembly.dll或.exe一起生成的符号(相关的.pdb文件)
  • 源文件(相关的.cs、.vb等文件)
  • 执行的机器代码必须未优化
符号由标志控制。如果指定
/debug:full
(即使在版本中,编译器优化已关闭),也可以附加到已运行的进程并逐步执行代码。如果您有
/debug:pdbonly
,则必须使用调试器启动程序(并且在附加到已运行的进程时无法查看符号)


优化由编译器选项进行粒度控制,但可以由进一步控制。

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


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

如何?我真的不知道你怎么能在发布模式下调试我遇到在发布模式下调试时我无法移动到其他组件所以你是说调试配置使调试复杂??不,对不起,我说优化代码使调试复杂。我会改写它,这样就不会让人困惑了。我的意思是,这么大的控制权被授予这些过程,这很奇怪。因为今天我看到我的同事在发布模式下无缝地调试代码,当我问他这件事时,他不知道。如果没有调试符号(.pdb文件),调试器将不知道原始源代码是什么,但它仍然能够逐步通过二进制代码。好的,调试器可以附加到它想要的任何进程,并逐步完成它。操作系统给了调试器很大的权限。嗯,所以调试器会更难,但还是有可能的?(我的意思是,没有pdb文件)?是的。仍有正在执行的机器代码,因此调试器可以对此进行检查。@KendallFrey调试器可以向您显示机器代码,但无法将其与原始源代码关联,因此,像这样调试代码很可能非常困难。