如何debugging.NET Windows服务OnStart方法?

我用.NET编写的代码只有在安装为Windows服务时才会失败。 失败不允许服务甚至启动。 我无法弄清楚如何进入OnStart方法。

如何:debuggingWindows服务应用程序提供了一个诱人的线索:

附加到服务的进程允许你debugging大部分但不是全部的服务代码; 例如,由于服务已经启动,因此无法以此方式debugging服务的OnStart方法中的代码,或者用于加载服务的Main方法中的代码。 解决这个问题的一种方法是在服务应用程序中创build临时的第二个服务,该服务仅用于帮助debugging。 您可以安装这两个服务,然后启动这个“虚拟”服务来加载服务进程。 一旦临时服务启动了进程,就可以使用Visual Studio中的“debugging”菜单附加到服务进程。

但是,我不清楚你是否应该创build虚拟服务来加载服务进程。

作为临时解决方法,您可以做的一件事就是启动debugging器作为OnStart中的第一行代码

System.Diagnostics.Debugger.Launch() 

这会提示你input你想要使用的debugging器。 只需要在Visual Studio中打开解决scheme,然后从列表中select该实例即可。

我倾向于添加一个像这样的方法:

  [Conditional("DEBUG")] private void AttachDebugger() { Debugger.Break(); } 

它只会调用你的项目的debugging版本,它会暂停执行,并允许你附加debugging器。

使用installutil.exe安装服务后,如果服务已启动,则可以更改“ Start Parameters以跳转到debugging器:

在这里输入图像说明

当使用参数-debugWithVisualStudio (或简单的-d )手动启动服务时,它将自动检测正确的项目,并在Visual Studio中-debugWithVisualStudio交互式debugging器:

在这里输入图像说明

要支持此function,请更改服务的OnStart()函数:

 /// <summary> /// Executed when the service is started. /// </summary> /// <param name="args">Command line arguments.</param> protected override void OnStart(string[] args) { try { //How to debug when running a Windows Service: // 1. Right click on the service name in Windows Service Manager. // 2. Select "Properties". // 3. In "Start Parameters", enter "-d" (or "-debugWithVisualStudio"). // 4. Now, when you start the service, it will fire up Visual Studio 2012 and break on the line below. // 5. Make sure you have UAC (User Access Control) turned off, and have Administrator privileges. #if DEBUG if (((ICollection<string>)args).Contains("-d") || ((ICollection<string>)args).Contains("-debugWithVisualStudio")) { Debugger.Launch(); // Launches VS2012 debugger. } #endif ShellStart(args); base.OnStart(args); } catch (Exception ex) { // Log exception here. } } 

(可选)如果要缩小到服务发生错误的代码行,请从Visual Studio菜单中DEBUG .. Exceptions 。 当你继续debugging的时候,它会在抛出exception的确切行上断开。

在这里输入图像说明

它工作得很好!

 protected override void OnStart(string[] args) { System.Diagnostics.Debugger.Launch(); } 

上述选项在Windows 8上似乎不起作用。

我已经添加了Thread.Sleep(15000); 到我的OnStart()方法,并在代码的下一行设置断点。 这给了我15秒的时间来启动服务后,将VSdebugging器附加到我的进程,并允许我很好地debuggingOnStart()方法。

你可以像这样添加一行代码:

 System.Diagnostics.Debugger.Break() 

这将popup一个窗口,提示您select使用哪个debugging器进行debugging,例如,允许您使用Visual Studio进行附加,并进入代码。

看到:

http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.break.aspx

可以将配套项目设置为作为控制台应用程序运行的Windows服务,但使用reflection访问服务方法。 有关详细信息和示例,请参阅此处: http : //ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/ 。

我知道这是迟到,但这是我们如何处理debuggingWindows服务

首先创build一个充当服务的类。

添加适当的启动,停止,暂停等方法

添加一个Windows窗体到服务项目。

在服务代码中创build上面创build的服务类,并在ServiceBase类中进行启动和停止服务所需的调用

打开Program.cs并添加以下内容

 #if DEBUG [STAThread] #endif static void Main() { try { #if DEBUG Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new DebugForm()); #else ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new YourWindowsService() }; ServiceBase.Run(ServicesToRun); #endif } catch (Exception e) { logger.Error(DateTime.Now.ToString() + " - " + e.Source + " - " + e.ToString() + "\r\n------------------------------------\r\n"); } } 

当你在DEBUG模式下运行时,窗体将会启动。 只要记住在完成时build立释放模式。 当然,条件编译variables可以是任何你喜欢的。 你甚至可以创build独立的项目,所以debugging的forms是它自己的项目。

希望这可以帮助

你也可以尝试System.Diagnostics.Debugger.Launch()方法。 它有助于将debugging指针指向指定的位置,然后可以debugging您的代码。

在此步骤之前, 使用Visual Studio命令提示符的命令行安装service.exeinstallutil projectservice.exe

然后从控制面板 – >pipe理工具 – >计算机pipe理 – >服务和应用程序 – >服务 – >您的服务名称开始您的服务

在服务OnStart方法中使用以下代码:

 System.Diagnostics.Debugger.Launch(); 

从popup消息中selectVisual Studio选项。 请记住以pipe理员身份运行Visual Studio。

注意:要仅以debugging模式使用它,可以使用#if DEBUG编译器指令,如下所示。 这将防止在生产服务器上发生意外或debugging模式。

 #if DEBUG System.Diagnostics.Debugger.Launch(); #endif 

正如其他人已经指出的,你必须添加一个debugging器中断到OnStart方法:

 #if DEBUG System.Diagnostics.Debugger.Break() #endif 

同时以pipe理员身份启动VisualStudio并允许一个进程可以由另一个用户自动debugging(如此处所述):

 reg add "HKCR\AppID\{E62A7A31-6025-408E-87F6-81AEB0DC9347}" /v AppIDFlags /t REG_DWORD /d 8 /f 

(我也在这里解释这个: https : //stackoverflow.com/a/35715389/5132456 )

尝试在有问题的方法内添加Debugger.Break。 当服务启动时会抛出一个exception,widows应该提供使用visual studio进行debugging。

我通常有一个控制台应用程序,假装是单片机,例如调用开始,停止,然后我可以只是F5为我的主要编码/debugging目的,并使用Debugger.Break进行debugging,当服务已经安装,并通过SCM。

这意味着更多的工作开始,我有一个类库,其中包含所有的服务代码,一个暴露了Windows服务类和控制台应用程序都可以调用的开始和停止的类。

马特

如果您在OnStart方法中添加了Debugger.Launch()并且它不起作用,那么您可能会遇到同样的问题,即在构造函数中发生exception,因此OnStart从未被调用过。 (头巴掌)

(对不起,如果这应该是一个评论别人的答案,但我没有足够的信用评论)

在我进入主题之前,build议一下。 如果您是服务器端开发人员,请始终使用日志。 因为在Visual Studio中debugging代码时可能无法产生一定的条件。

回到主题,我使用Envoirnment.UserInteractive标志这真的很方便看到我的代码如下

 public static void Main(string[] args) { if (System.Environment.UserInteractive) { string parameter = string.Concat(args); switch (parameter) { case "--install": ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); break; case "--uninstall": ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); break; default: WindowsService service = new WindowsService(); service.OnStart(args); Console.ReadKey(); service.OnStop(); break; } } else { ServiceBase.Run(new WindowsService()); } } 

从Visual Studio中你将得到UserInteractive标志设置,所以我会运行它作为控制台应用程序,除此之外,即使你可以通过双击运行产品构build,并附加debugging与它,如果你想testing它。

我有一个有趣的做法,我添加了另一个名为DebugNoService的configuration

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugNoService|AnyCPU' "> <OutputPath>.\</OutputPath> <AllowUnsafeBlocks>false</AllowUnsafeBlocks> <BaseAddress>285212672</BaseAddress> <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow> <ConfigurationOverrideFile> </ConfigurationOverrideFile> <DefineConstants>DEBUG;TRACE;DEBUGNOSERVICE</DefineConstants> <DocumentationFile> </DocumentationFile> <DebugSymbols>true</DebugSymbols> <FileAlignment>4096</FileAlignment> <NoStdLib>false</NoStdLib> <NoWarn> </NoWarn> <Optimize>false</Optimize> <RegisterForComInterop>false</RegisterForComInterop> <RemoveIntegerChecks>false</RemoveIntegerChecks> <TreatWarningsAsErrors>false</TreatWarningsAsErrors> <WarningLevel>4</WarningLevel> <DebugType>full</DebugType> <ErrorReport>prompt</ErrorReport> <UseVSHostingProcess>false</UseVSHostingProcess> </PropertyGroup> 

我使用#if指令。 ProjectInstaller.cs

 #if !DEBUGNOSERVICE static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; ..... } #endif 

我添加一个窗体窗体,我也包裹窗体窗体

 #if DEBUGNOSERVICE ... static void Main() { Form form; Application.EnableVisualStyles(); Application.DoEvents(); form = new <the name of the form>(); Application.Run(form); } ... #endif 

取决于所select的configuration,代码要么作为一个Windows窗体应用程序,可以很容易地debugging或作为服务运行。

如果看起来像很多工作,但它一直工作,使debugging代码非常容易。 您可以将各种输出添加到表单,以便您可以观看它的运行。