首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何调试Windows服务?

如何调试Windows服务?
EN

Stack Overflow用户
提问于 2011-03-01 23:18:10
回答 16查看 26.6K关注 0票数 47

我读了关于这个主题的MSDN文章。引述如下:

由于服务必须从服务控制管理器的上下文中运行,而不是从Visual Studio中运行,因此调试服务不像调试其他Visual Studio应用程序类型那样简单。若要调试服务,必须启动该服务,然后将调试器附加到运行该服务的进程。然后,您可以使用Visual Studio的所有标准调试功能来调试应用程序。

现在我的问题是我的服务一开始就无法启动。首先,它崩溃了,并说:

在MyServiceName.exe3596中发生未处理的异常(System.Runtime.InteropServices.COMException) )

并建议我对其进行调试(当我选择一个调试器实例时,调试器实例立即崩溃)。然后它会说

无法在本地计算机上启动MyServiceName服务。错误1053:服务未及时响应启动或控制请求

那么,我如何调查/调试我的服务无法启动的原因?问题是,我创建了一个控制台应用程序,它完全执行服务所做的事情,并且运行得很好。(我的意思是,我只是将OnStart()方法和主循环的内容复制到了main中)。

任何帮助都将不胜感激。

该服务是用C#编写的,大量使用了互操作。我正在使用VS2008

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2011-03-01 23:30:06

您可以使用一个参数来让您的应用程序决定是作为服务启动还是作为常规应用程序启动(例如,在本例中显示表单或启动服务):

代码语言:javascript
复制
static void Main(string[] args)
{
    if ((1 == args.Length) && ("-runAsApp" == args[0]))
    {
        Application.Run(new application_form());
    }
    else
    {
        System.ServiceProcess.ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new MyService() };
        System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
}

现在,如果你传递参数"-runAsApp“,你可以正常调试应用程序--单片机不会传递这个参数,所以你也可以在没有任何代码更改的情况下使用它作为服务(假设你是从ServiceBase派生的)

编辑:

windows服务的另一个区别是身份(对于InterOp来说,这一点可能特别重要)-你想要确保你在“应用”模式和服务模式下使用相同的身份进行测试。

要做到这一点,你可以在应用程序模式中使用模拟(如果有帮助,我可以发布一个C#包装器,但这可以很容易地用谷歌搜索)来使用你的windows服务将在其下运行的相同身份,即通常是LocalService或NetworkService。

如果需要其他身份,您可以向app.config添加设置,以允许您决定是否使用凭据,如果使用,则模拟哪个用户-这些设置将在作为应用程序运行时处于活动状态,但对windows服务关闭(因为服务已经在所需的身份下运行):

代码语言:javascript
复制
  <appSettings>
    <add key="useCredentials" value="false"/>
    <add key="user" value="Foo"/>
    <add key="password" value="Bar"/>
  </appSettings>
票数 38
EN

Stack Overflow用户

发布于 2011-03-01 23:30:43

我通常只是手动设置一个断点,然后将其指向c#中当前打开的项目。设置断点的代码为:

代码语言:javascript
复制
System.Diagnostics.Debugger.Break();

这应该会让你入门,然后你就可以逐步检查你的代码,看看到底发生了什么。

票数 21
EN

Stack Overflow用户

发布于 2011-03-02 00:36:47

这是我从C. Lawrence Wenham那里偷来的,所以我真的不能算功劳,但你可以通过编程方式将调试器附加到服务上,而不会中断执行,只需使用以下代码:

代码语言:javascript
复制
System.Diagnostics.Debugger.Launch();

将其放入服务的OnStart()方法中,作为第一行,它将提示您选择一个VS实例来附加其调试器。从那时起,系统将在您设置的断点处停止,并在抛出异常时停止。我会在代码周围添加一个#if DEBUG子句,这样发布版本就不会包含它;或者,在发现问题后,您可以直接将其去掉。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5156427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档