2011-10-17 42 views
0

我試圖啓動我的調試版本WindowsService,但是收到錯誤,指出它沒有及時啓動。安裝WindowsService以進行調試

我已經清理了ctor和OnStart,但它仍然不會啓動,所以我想也許它加載的dll需要更好的安裝,而不僅僅是在我的項目目錄的調試目錄。也許main()中的所有凹凸都掛在乾燥?

任何用於調試服務的指針?我無法直接在VStudio中運行它,因爲很顯然,它不允許進入它的OnCustomCommand(int cmd)成員並在那裏打破它。

+0

要使Windows服務正確啓動,OnStart方法需要在30秒內返回,因此如果您在該方法中的任何地方斷開,或者它調用的代碼將會遇到您所看到的問題。 – Matt

回答

2

如果我理解正確,您希望能夠在服務處於閒置「啓動」狀態之前調試該服務?

您可以使用Debugger.Break()函數。比如,我們經常把下面進入我們的主要功能,而在調試版本:

#if DEBUG 

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

#endif 
+0

目前我已經在發佈模式編譯,因爲我覺得我的'#if _DEBUG MyService :: startInstance(service);/*在下面一行放置一個斷點,當它完成其工作時總是捕獲你的服務*/Thread :: Sleep(Timeout :: Infinite);'可能是造成破壞的原因。它的工作原理,但不會打破VStudio。這是你鏈接到的一個有趣的方法,謝謝。 – John

+0

我不能讓它附加,更多的信息將是有用的 - 沒關係,但一些好的技巧已經進入相關部分。 – John

+0

我想調試器。IsAttached將是錯誤的,除非您啓動服務並快速處理,*之前*代碼到達'if'語句 – Matt

1

我只會做盡可能少在OnStart方法,足以初始化揭開序幕一個線程,做所有的工作,所以你可以儘快從OnStart返回。然後在線程委託中,您可以添加Reddog的代碼以打入調試器,可能會使用thread.sleep,這樣可以讓您有時間首先附加到進程。

另一種替代方法是向服務添加一個主要方法,該方法可以創建服務類的實例並調用onstart/onstop,並將項目輸出更改爲控制檯應用程序,然後獲得兩全其美的方法將通過installutil作爲服務安裝,並且您可以運行它並在Visual Studio中作爲控制檯應用程序進行調試。

詳細here

如果你要調試的服務只是作爲一種服務,那麼我建議您OnStart方法啓動一個線程,做了處理,然後返回,線程委託然後可以做一個主題。睡眠(一段合理的時間),然後Debugger.Break();

線程休眠使您有機會將調試器附加到進程,在使用服務控制管理器啓動服務之後,它將進入Debugger.Break(),這將強制調試器中斷,從而允許您一步到位。關鍵是要在30秒之前從OnStart返回,並在打斷點之前將調試器附加到該過程。

此外,我認爲Debugger.Break提供了附加調試器的選項,因此請在代碼中嘗試(不知道它是否與服務配合良好,但因爲它們應該沒有UI),您可能會得到堅持Debugger.Break進入你的委託並在30秒前附加到進程。

+0

這種方法唯一的缺點是它不能作爲一個真正的服務來處理'OnCustomCommand'。 Reddog的代碼在我的委託或任何地方都不起作用......可能是由於VCExpress或我的配置。 – John

+0

是的,它默認情況下不會調用OnCustomCommand,但是您可以修改主方法來接受來自控制檯的輸入並自己調用OnCustomCommand。 – Matt

+0

糟糕,只注意到OnCustomCommand受保護......但是,您可以在您的服務類上公開一個調用該方法的方法,以允許您從測試工具中調用該方法。就我個人而言,我寫的服務使用服務基礎派生類作爲圍繞另一個類的薄包裝器,可以從服務或控制檯應用程序實例化和調用另一個類,以便執行測試。 – Matt

相關問題