【问题标题】:Debugging in .NET in Release mode在发布模式下在 .NET 中调试
【发布时间】:2012-06-18 17:32:21
【问题描述】:

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

【问题讨论】:

  • 怎么样?我真的不知道如何在发布模式下调试
  • 在发布模式下调试时遇到无法移动到其他组件

标签: .net debugging clr cil


【解决方案1】:

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

【讨论】:

  • 所以你是说调试配置使调试复杂化??
  • 不,抱歉,我说优化代码会使调试复杂化。我会改写它,以免混淆。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我的意思是,对这些进程授予如此大的控制权是很奇怪的。因为今天看到同事在Release模式下无缝调试代码,当我问他这个时,他不知道。
    • 没有调试符号(.pdb 文件),调试器将不知道原始源代码是什么,但它仍然能够单步执行二进制代码。 AFAIK,调试器可以附加到它想要的任何进程,并逐步执行它。操作系统赋予调试器很大的权限。
    • 嗯,所以调试器会更难,但仍然可能?(我的意思是,没有 pdb 文件)?
    • 是的。仍有机器代码正在执行,因此调试器可以检查它。
    • @KendallFrey 调试器可以向您显示机器代码,但无法将其与原始源代码相关联,因此调试这样的代码很可能非常困难。
    猜你喜欢
    • 2014-02-18
    • 2011-09-02
    • 2010-11-17
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多