如何调试正在安装的Windows服务?

时间:2010-04-09 00:03:06

标签: visual-studio windows-services installer debugging

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

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

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

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

    更新

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

    我真的不确定如何调试这个,令人沮丧的是这个服务过去常常正常工作。

    答案:

    检查应用程序日志向我显示了抛出的异常。事实证明我在安装程序中意外地破坏了一个文件,这解释了为什么我的调试技术都没有用。一旦我恢复了文件,我就可以正常连接视觉工作室(使用30秒暂停给我时间)。

3 个答案:

答案 0 :(得分:2)

  1. 在services.msc中,右键单击您的服务并选择属性。
  2. 在“登录”选项卡中启用“允许服务与桌面交互。”
  3. 在ServiceBase的OnStart方法中添加Debug.Assert(false, "attach now");之类的内容。
  4. 附加到流程并在断言对话框中单击忽略。
  5. 编辑1:我发生的事情,没有特别的顺序;

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

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

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

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

    编辑2:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

  1. First
  2. Second