Debug.WriteLine()没有被命中

时间:2011-08-16 12:55:07

标签: c# .net debugging windows-services

我正在使用以下代码调试Windows服务(通过在Visual Studio 2010中点击F5):

Program.cs 文件中:

static void Main() {

    if (!Environment.UserInteractive) {
        // We are not in debug mode, startup as service

        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new MyServer() };
        ServiceBase.Run(ServicesToRun);
    } 
    else {
        // We are in debug mode, startup as application

        MyServer service = new MyServer();
        service.StartService();
        System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    }
}

MyServer.cs 文件中:

public void StartService() {
    this.OnStart(new string[0]);
}

过去,我在所有服务代码中使用Debug.WriteLine("xxx")行没有任何问题,但现在我注意到所有Debug.WriteLine()行都不再被调用。

当我使用 Step Into F11)进行调试时,我清楚地看到调试器正在跳过这些行 - (因此,输出窗口上没有输出文本),而服务在“调试模式”中正确启动。

我不明白为什么不会调用Debug代码。建议?

我在调试模式下构建我的解决方案(Define DEBUG constant已检查),但我注意到#if DEBUG ... #endif包围的代码未被调用。这很奇怪......

5 个答案:

答案 0 :(得分:5)

似乎缺少调试符号。

  1. 清理解决方案,重新启动Visual Studio,重建解决方案。
  2. 确保Configuration Manager处于调试模式。
  3. 签入工具>选项>调试并取消选中“启用我的代码”
  4. 发生在我身上,这似乎有所帮助。

答案 1 :(得分:1)

如果您没有使用调试版本,则编译器会排除代码。该方法的签名类似于:

[Conditional("DEBUG")]
public static void WriteLine(string message) { }

当您进行调试构建时,该属性告诉编译器包含调用到相关方法。因此,如果您没有使用DEBUG标志集(例如,发布版本)进行编译,那么编译器将完全取消调用。

Debug.Assert也是如此。

您也可以在自己的代码中使用此属性,并使用您喜欢的任何标签。

另一种思考这个属性的方法是强制对具有属性的方法的所有调用都包含在指令中 - 类似于:

    DoSomething();

#if DEBUG
    Debug.WriteLine("I'm a debug build");
#endif

    DoSomethingElse();

修改

您要通过Environment.UserInteractive尝试实现的目标是什么?也许你的意思是Debugger.IsAttached?如果您想检查它是否是调试版本,那么您可以使用上面的ConditionalAttribute#if #endif指令。

答案 2 :(得分:1)

我有同样的随机问题。

我能够通过以下方式修复它:

  1. 取消选中 Project Properties -> Build -> Define DEBUG constant
  2. 点击保存
  3. 再次检查 'Define DEBUG constant'选项
  4. 点击保存
  5. 重建项目
  6. 运行
  7. 执行此操作后,按预期点击#if DEBUG行。

答案 3 :(得分:0)

Environment.UserInteractive与调试模式不同 - 这只是意味着您在控制台而不是服务中运行它。确保您的构建配置设置为Debug。

答案 4 :(得分:0)

导航至项目属性 - >构建并确保选中“Define DEBUG Constant”和“Define TRACE Con​​stant”复选框。