我是否应该在发布配置中运行时在Visual Studio的输出窗口中看到调试输出?

时间:2018-06-03 00:25:30

标签: c# visual-studio

我想知道在发布模式下运行时我是否打算在Debug输出中看到任何内容?

下图是我在发布配置中运行时输出窗口的屏幕截图。 enter image description here

看到调试的东西让我觉得我实际上并没有运行发布编译,有没有办法可以确定我肯定在运行发布模式?

1 个答案:

答案 0 :(得分:2)

简短回答

这些似乎是Trace messages,而不是Debug messages,所以它们甚至出现在发布版本中。

长答案

通过调查术语"调试"的各种语境含义,让我们看看发生了什么。这里。

"调试"构建配置

首先,使用" Debug"下拉列表的上下文。和"发布" Visual Studio中的选项。这些选项是构建配置。要了解此选项的重要性,请双击"属性"您的项目的节点,并切换到" Build"页。

The "Build" page in the properties of a C# project

此页面(以及其他一些页面)可以具有特定于某个构建配置的设置。您可以通过页面上的下拉菜单查看每个配置的设置(默认为您当前正在使用的任何构建配置)。

名称" Debug"没有什么特别之处。和"发布" - 这些只是默认配置,具有这些方案的默认设置。您可以更改配置的设置。您也可以定义自己的构建配置,但这样做不在本答案的范围内。最后,这些设置也由simliar目标平台参数化(例如," AnyCPU"," x86"等),但对于这个答案,我假设所有构建都是使用相同的平台设置。

" DEBUG"条件编译符号

C#具有条件编译功能 - 能够根据编译时定义或未定义的符号编译不同的代码段。例如,这个常数的值为" A"如果MY_SYMBOL_NAME被定义,或者" B"否则。

        public const string MyConst =
#if MY_SYMBOL_NAME
      "A";
#else
      "B";
#endif

项目的前三个设置" Build"页面控制这些符号。特别是"定义DEBUG常数"和"定义TRACE常数" - 这实际上是指编译符号。通过选中这些,所选的构建设置将分别使用DEBUGTRACE符号进行编译。

默认情况下," Debug"和"发布"配置定义TRACE,但仅适用于#34; Debug"定义DEBUG

Debug班级

条件编译专门扩展到System.Diagnostics.DebugSystem.Diagnostics.Trace类的成员:对这些类的调用'只有在定义了适当的符号时才会编译方法。所以这个:

Debug.WriteLine("!");

是这样对待的:

#if DEBUG
    Debug.WriteLine("!");
#endif

这些方法写入所谓的"跟踪侦听器",can be configured either in code or in application configuration files

因此,如果您看到的文字是通过拨打Trace来写的,那么即使在发布配置中,您仍会看到它。当然,这意味着此日志记录将保留在已发布的版本中,除非您明确禁用"定义TRACE常量"设置。

开始调试与启动而不调试

那么为什么Visual Studio会显示这些内容呢?因为" Debug"的一个更多含义是:您是否使用Visual Studio的调试器启动应用程序。启动的两个选项都列在VS'调试菜单栏:"开始调试"和"开始时不调试"。某些内容与您正在使用的构建配置正交:您可以在没有附加调试器的情况下运行Debug构建,并且可以运行附加调试器的Release构建(尽管这可能没有用,因为某些部分可能不会出现断点)例)。

使用调试器时,“输出”窗口显示写入默认跟踪侦听器的消息。这标有" Debug"但它包括在那里写的任何内容 - 包括调用Trace,在发布版本中包含(默认情况下)。