如果发布版本生成 .pdb 文件并且您可以进入每一行,放置断点等,那么为什么还要费心构建我的组件的“调试”版本呢?
我在我的项目中使用 c#,并且我在调试发布版本时没有问题。在 C++ 中,我在调试优化代码时遇到了问题,但在 C# 中它工作正常。我不是在谈论愚蠢的代码块,比如if(false)
......
如果发布版本生成 .pdb 文件并且您可以进入每一行,放置断点等,那么为什么还要费心构建我的组件的“调试”版本呢?
我在我的项目中使用 c#,并且我在调试发布版本时没有问题。在 C++ 中,我在调试优化代码时遇到了问题,但在 C# 中它工作正常。我不是在谈论愚蠢的代码块,比如if(false)
......
发布版本更加优化,例如,当我调试发布版本时,当运行时不使用局部变量的值时,它们的值会消失,这让我很恼火。
一个原因是附加与启动。
如果您在 .Net 中启动零售进程,则调试几乎与启动调试进程一样好。您可能不会注意到调试体验有任何不同。
Attach是一个完全不同的球类游戏。C# 和 VB 都通过了零售版本的 /optimize+ 标志。这将在没有 DebuggingMode.DisableOptimizations 标志的程序集级别嵌入DebuggableAttribute。在进程启动期间,VS / CLR 将进行通信以基本上忽略这一事实并禁用影响调试的 JIT 优化。在附加期间,不会发生此类项目,并且 JIT/CLR 将优化它的核心内容。我向你保证,在这种情况下,调试体验要差得多。
您可以在 VS 中进行实验
在 (c#) winforms 中,您无法在发布版本中编辑和继续。
除了其他答案之外,#define DEBUG
当发生未捕获的异常时,我使用自动生成的来更改行为:
有几个原因:
Debug.Assert
etc 的调用都将被删除。当然,其中很多都可以在构建配置中进行更改。一种相当常见的方法是保留默认设置,除了在发布版本中包含更多调试信息,这可以为您提供更有用的堆栈跟踪(如果您使用调试器,则可以提供更好的调试体验)。
发布版本比调试版本执行额外的优化,但是调试版本也会稍微改变 GC 的行为,以确保您在调试会话期间不会从您的下方收集到对象。调试构建还可以防止在 JIT 期间发生某些优化,这将对您的调试会话产生负面影响。
我同意 Lennaert - 我倾向于在构建之间进行不同的错误处理。例如,对于某些应用程序,我在调试版本中是超级肛门。前置条件和后置条件、断言、异常等。我基本上是在试图强制开发人员正确使用我的库。另一方面,在发布版本中,我放宽了条件以提高性能。
当您使用按合同设计时,重要的是有两个构建 - 一个不检查Preconditions、Postconditions和Class Invariants的发布版本和一个检查它们的调试版本(通过assertions)。
在某些情况下,前置条件检查可能会在发布模式下保持活动状态(搜索相关问题),但这并不会改变整个故事。
在开发阶段,您检查所有合同假设,当您发布时,您不再检查它们 - 您知道您已经测试了代码并且它有效,所以您只需依赖之前的假设 - 这就是它们的目的首先。