【问题标题】:How to debug the installation of a custom Windows service?如何调试自定义 Windows 服务的安装?
【发布时间】:2012-03-18 21:40:04
【问题描述】:

我在 C# (4.0) 中创建了一个 Windows 服务,并尝试在命令行中使用 installutil 工具安装它。但是我得到一个例外。我设法找出我的代码的哪一部分导致了异常 - 使用了一些糟糕的日志记录,但无论如何 - 但现在我想了解原因。所以我想做的是调试我的 Windows 服务的安装。

我知道如何调试服务本身,但是在这里,我想在服务中调试我的Installer.Install(IDictionary stateSaver)方法的内容。

我尝试将调试器附加到 cmd.exe 进程,但它显然不起作用。我也在考虑将调试器附加到 installutil 进程,但我不知道如何做到这一点。

我看过这个帖子:How do you debug a windows service that is being installed? 和其他几个帖子,但在这种情况下,出于某种原因,这个人似乎已经在 services.msc 中提供了他的服务,这不是我的情况。

我怎样才能做到这一点?

【问题讨论】:

  • 安装 Windows 服务时遇到的具体异常是什么?
  • @ABKolan 我在我正在使用(和我创建)的类的静态构造函数上得到TypeInitializerException,这是由该构造函数中的对象上的NullReferenceException 引起的。这个对象与我创建的一些自定义配置类有关。奇怪的是,这段代码也被另一个服务使用,并且在那个服务中一切正常。这就是我要调试安装过程的原因。
  • 使用stackoverflow.com/a/9498566/64497中的解决方案

标签: c# debugging windows-services installutil


【解决方案1】:

您可以在安装程序代码中添加Debugger.Break(); 语句,它应该会为您启动调试器。

【讨论】:

  • @sotn 你可以提出一个新问题来获得帮助。请记住包含您遇到的任何错误。
  • @KlausByskovPedersen 我通过使用 Debugger.Launch() 解决了这个问题。该错误的原因是如果没有可用的调试器,则 Debugger.Break 将使您的应用程序崩溃,而 Debugger.Launch 将启动如果没有可用..
【解决方案2】:

如果上述方法不起作用,我发现这个过程也有效。基本上,您在调试模式下编译并安装服务(我通过命令行使用 installutil.exe)。在代码中,您会弹出一个带有进程 ID 的消息框。启动第二个工作室实例,将其附加到该进程并进行调试。消息框将其暂停以允许设置。进程 ID 并不重要,它的名称为 InstallUtil.exe。我一般会在消息框后面加上一个Debug.Break()来保证它进入代码。

using System.Windows.Forms;
using System.Diagnostics;

...

#if DEBUG 
int processId = Process.GetCurrentProcess().Id;
string message = string.Format("Please attach the debugger (elevated on Vista or Win 7) to process [{0}].", processId);
MessageBox.Show(message, "Debug");
#endif

....

How to debug the installation of a custom windows service

【讨论】:

  • 这对我有帮助。我将 WPF 与 #if DEBUG System.Windows.MessageBox.Show("Attach debugger now"); #endif 一起使用。在 VS Attach to Process 对话框中很容易找到 InstallUtil 进程。这样您就不必添加任何额外的 using 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多