我正在使用以下代码调试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
包围的代码未被调用。这很奇怪......
答案 0 :(得分:5)
似乎缺少调试符号。
发生在我身上,这似乎有所帮助。
答案 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)
我有同样的随机问题。
我能够通过以下方式修复它:
Project Properties -> Build -> Define DEBUG constant
'Define DEBUG constant'
选项执行此操作后,按预期点击#if DEBUG
行。
答案 3 :(得分:0)
Environment.UserInteractive
与调试模式不同 - 这只是意味着您在控制台而不是服务中运行它。确保您的构建配置设置为Debug。
答案 4 :(得分:0)
导航至项目属性 - >构建并确保选中“Define DEBUG Constant”和“Define TRACE Constant”复选框。