【问题标题】:Installing a WindowsService for debugging安装用于调试的 WindowsService
【发布时间】:2011-10-17 22:51:05
【问题描述】:

我正在尝试启动我的调试版本WindowsService,但我收到了它没有及时启动的错误。

我已经清理了 ctor 和 OnStart,但它仍然无法启动,所以我认为它加载的 dll 可能需要更好地安装,而不仅仅是在我的项目目录的调试目录中。也许main() 中的所有问题都在晾干?

任何调试服务的指针?我不能直接在 VStudio 中运行它,因为显然这不允许进入其OnCustomCommand(int cmd) 成员并在那里破坏它。

【问题讨论】:

  • 要正确启动 Windows 服务,OnStart 方法需要在 30 秒内返回,因此,如果您在该方法中的任何地方或它调用的代码中中断,您将遇到您所看到的问题。跨度>

标签: .net debugging windows-services onstart


【解决方案1】:

如果我理解正确,您希望能够在服务处于空闲“已启动”状态之前对其进行调试?

您可以为此使用Debugger.Break() 函数。例如,我们经常在调试构建时将以下内容放入我们的 Main 函数中:

#if DEBUG

if (!Debugger.IsAttached)
{
    Debugger.Break();
}

#endif

【讨论】:

  • 目前我已经在发布模式下编译,因为我觉得我的#if _DEBUG MyService::startInstance(service); /*Put a breakpoint on the following line to always catch your service when it has finished its work*/ Thread::Sleep(Timeout::Infinite); 可能是造成破坏的原因。它可以工作,但不会破坏 VStudio。这是您链接到的有趣方法,谢谢。
  • 我无法将其附加,更多信息会很有用 - 不过没关系,相关部分提供了一些很好的提示。
  • 我认为 Debugger.IsAttached 将是 false,除非您启动服务并快速附加到进程,代码到达'if'语句之前
  • 哦,抱歉,顺便说一句,那是 C# 代码...该代码旨在作为手动方式来确保提示 Visual Studio 可能附加一个实例以进行调试。正如马特所说,它仅在调试器尚未连接时才会弹出 - 他的链接显示了从调试角度运行完全交互式服务的一些好方法。
  • 我认为 Debugger.Launch 不会提示附加,Debugger.Break 会提示
【解决方案2】:

我只会在 OnStart 方法中做尽可能少的事情,足够的 init 来启动一个完成所有工作的线程,这样您就可以尽快从 OnStart 中返回。然后在线程委托中,您可以添加 Reddog 的代码以中断调试器,可能在其中添加一个 thread.sleep,以便您有时间先附加到进程。

另一种选择是在你的服务中添加一个 main 方法,它可以创建服务类的实例并调用 onstart/onstop,并将项目输出更改为控制台应用程序,然后你就可以两全其美了,它'将通过 installutil 作为服务安装,您可以在 Visual Studio 中将其作为控制台应用程序运行和调试。

详情here

如果您只想将服务作为服务进行调试,那么我建议您的 OnStart 方法启动一个执行处理然后返回的线程,然后线程委托可以执行 Thread.Sleep(一些合理的时间) 然后是 Debugger.Break();

线程休眠让您有机会将调试器附加到进程,在您使用服务控制管理器启动服务后,它会到达 Debugger.Break(),这将强制调试器中断,允许您一小步。关键是在 30 秒之前从 OnStart 返回,并在您遇到断点之前将调试器附加到进程。

另外,我认为 Debugger.Break 为您提供了附加调试器的选项,因此请在代码中尝试(不确定它是否与服务很好地配合,尽管它们应该没有 UI)您可能会坚持下去Debugger.Break 进入您的委托并在 30 秒前附加到进程。

【讨论】:

  • 这种方法的唯一缺点是它不能作为能够处理OnCustomCommand 的真正服务运行。 Reddog 的代码在我的委托或任何地方都不起作用......可能是由于 VCExpress 或我的配置。
  • 是的,默认情况下它不会调用 OnCustomCommand,但是您可以修改 main 方法以接受来自控制台的输入并自己调用 OnCustomCommand。
  • 糟糕,刚刚注意到 OnCustomCommand 受保护...但是,您可以在服务类上公开一个调用该方法的方法,以允许您从测试工具中调用它。就我个人而言,我编写的服务使用服务基派生类作为另一个类的瘦包装器,该类可以从服务或控制台应用程序实例化和调用,以便执行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多