【问题标题】:How do you debug a windows service that is being installed?如何调试正在安装的 Windows 服务?
【发布时间】:2010-04-09 00:03:05
【问题描述】:

我知道如何将调试器附加到 Windows 服务,但我似乎无法附加到正在由 Windows 安装程序安装和启动的调试器。我试过了:

  1. 设置线程.Sleep(TimeSpan.FromSeconds(30));在开始时,但是当我尝试在 Visual Studio 中附加时,服务的名称不会作为选项出现。这通常有效,服务的名称会显示在列表中,但使用安装程序时不会。

  2. 设置 Debugger.Break 和 Debugger.Launch。两者都没有真正做任何事情。

我可以做些什么来调试我的服务?

更新:

我在服务的第一行添加了一个 Thread.Sleep 30 秒,当安装程序提示我失败时应该做什么时,我在服务列表中启动该服务(因为它没有已删除),它立即失败,无需等待 30 秒。它安装的文件是最新的(他们有正确的修改时间)。如果我在同一个项目中从我的测试应用程序运行同一个客户端,则会出现 30 秒的暂停,但由于某种原因,安装程序出现了问题。

我真的不知道如何调试这个,令人沮丧的是这个服务曾经正常工作。

答案:

检查应用程序日志向我显示了正在引发的异常。原来我不小心破坏了我的安装程序中的一个文件,这解释了为什么我的调试技术都不起作用。恢复文件后,我就可以像往常一样使用 Visual Studio 进行附加(使用 30 秒的暂停来给我时间)。

【问题讨论】:

  • 您的服务是否安装失败?一些日志文件可能有用。我不相信 OnStart 通常被称为安装的一部分。
  • 嗯,它特别说它无法启动。另外,该服务位于服务列表中,并且文件已就位。我在哪里可以找到这些日志文件?我检查了安装目录,以及InstallUtil.exe所在的目录。

标签: visual-studio windows-services installation debugging


【解决方案1】:
  1. 在 services.msc 中,右键单击您的服务并选择属性。
  2. 在登录选项卡中启用允许服务与桌面交互。
  3. Debug.Assert(false, "attach now"); 之类的内容添加到 ServiceBase 的 OnStart 方法中。
  4. 附加到进程并在断言对话框中单击忽略。

编辑1:发生在我身上的事情,不分先后;

如果它曾经可以工作,是否有可能不再以同一用户身份运行?可能是新用户没有相同的权限或者权限改变了。

使用事件查看器检查应用程序日志。

如果在安装过程中出现问题,InstallUtil.InstallLog 或 {assemblyname}.InstallLog 中可能会有一些信息,这些信息与 .exe 位于同一目录中。

我是在我的 Linux 笔记本电脑上做这个的,所以我有点模糊。

编辑 2:

在服务管理器中,右键单击您的服务并选择属性。验证服务是否指向正确的可执行文件;我已经看到后期构建步骤做了一些时髦的事情。

【讨论】:

  • 我试过了,将安装程序设置为将服务设置为具有桌面交互,并将 Assert(false) 作为服务的第一行(它实际上是构造函数中的第一行) OnStart 初始化,如果这很重要的话),但这并没有做任何事情。它只是说它像往常一样无法启动。
【解决方案2】:

当您附加 VS 调试器时,请确保选中“显示所有用户的进程”。您的服务可能在本地服务或本地系统下运行。

【讨论】:

    【解决方案3】:

    这里有几个链接可以帮助您在没有 VS.NET 的生产环境中解决 Windows 服务启动问题。这也可以在 Dev 中使用。

    1. First
    2. Second

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 2011-07-06
      • 2011-07-01
      相关资源
      最近更新 更多