4

如果发布版本生成 .pdb 文件并且您可以进入每一行,放置断点等,那么为什么还要费心构建我的组件的“调试”版本呢?

我在我的项目中使用 c#,并且我在调试发布版本时没有问题。在 C++ 中,我在调试优化代码时遇到了问题,但在 C# 中它工作正常。我不是在谈论愚蠢的代码块,比如if(false)......

4

8 回答 8

8

发布版本更加优化,例如,当我调试发布版本时,当运行时不使用局部变量的值时,它们的值会消失,这让我很恼火。

于 2009-03-11T14:12:32.190 回答
7

一个原因是附加与启动。

如果您在 .Net 中启动零售进程,则调试几乎与启动调试进程一样好。您可能不会注意到调试体验有任何不同。

Attach是一个完全不同的球类游戏。C# 和 VB 都通过了零售版本的 /optimize+ 标志。这将在没有 DebuggingMode.DisableOptimizations 标志的程序集级别嵌入DebuggableAttribute。在进程启动期间,VS / CLR 将进行通信以基本上忽略这一事实并禁用影响调试的 JIT 优化。在附加期间,不会发生此类项目,并且 JIT/CLR 将优化它的核心内容。我向你保证,在这种情况下,调试体验要差得多。

您可以在 VS 中进行实验

  • 将构建切换到发布
  • CTRL+F5 无需调试即可启动
  • 附加到进程。
于 2009-03-11T14:14:35.087 回答
5

在 (c#) winforms 中,您无法在发布版本中编辑和继续。

于 2009-03-11T14:15:05.600 回答
3

除了其他答案之外,#define DEBUG当发生未捕获的异常时,我使用自动生成的来更改行为:

  • 如果在发布模式下运行,向用户显示一条好消息并可选择记录错误,
  • 如果在调试模式下运行,不要做任何事情(这会导致调试器中断)
于 2009-03-11T14:24:00.460 回答
2

有几个原因:

  • 默认情况下,发布版本不会在 PDB 文件中包含那么多调试信息。我相信这个选项过去更加突出 - 它现在位于输出下的“高级设置”中,可能的值是“无”、“完整”(调试版本的默认值)和“pdb-only”(发布的默认值)构建)。
  • 默认情况下,发布版本是优化的:尽管由于 JIT 完成了大部分工作,这在 C# 中并没有像在其他语言(例如 C++)中那样产生很大的差异,但很可能存在一些差异,使其更难调试发布版本。
  • 默认情况下,发布版本没有定义 DEBUG 符号,因此任何对Debug.Assertetc 的调用都将被删除。

当然,其中很多都可以在构建配置中进行更改。一种相当常见的方法是保留默认设置,除了在发布版本中包含更多调试信息,这可以为您提供更有用的堆栈跟踪(如果您使用调试器,则可以提供更好的调试体验

于 2009-03-11T14:18:34.500 回答
0

发布版本比调试版本执行额外的优化,但是调试版本也会稍微改变 GC 的行为,以确保您在调试会话期间不会从您的下方收集到对象。调试构建还可以防止在 JIT 期间发生某些优化,这将对您的调试会话产生负面影响。

于 2009-03-11T14:16:14.037 回答
0

我同意 Lennaert - 我倾向于在构建之间进行不同的错误处理。例如,对于某些应用程序,我在调试版本中是超级肛门。前置条件和后置条件、断言、异常等。我基本上是在试图强制开发人员正确使用我的库。另一方面,在发布版本中,我放宽了条件以提高性能。

于 2009-03-11T14:32:27.867 回答
0

当您使用按合同设计时,重要的是有两个构建 - 一个不检查PreconditionsPostconditionsClass Invariants的发布版本和一个检查它们的调试版本(通过assertions)。

在某些情况下,前置条件检查可能会在发布模式下保持活动状态(搜索相关问题),但这并不会改变整个故事。

在开发阶段,您检查所有合同假设,当您发布时,您不再检查它们 - 您知道您已经测试了代码并且它有效,所以您只需依赖之前的假设 - 这就是它们的目的首先。

于 2009-03-11T14:34:55.550 回答