Windows服务程序的调试
摘自:MSDN
??? 1.由于服務必須從服務控制管理器的上下文中運行,而不是從 Visual Studio 中運行,因此調試服務不像調試其他 Visual Studio 應用程序類型那樣簡單。若要調試服務,必須首先啟動服務,然后將一個調試器附加到正在運行服務的進程中(AttachToProcess)。
???? 附加到服務的進程使您能夠調試大多數服務代碼,但并非全部;例如,由于服務已經啟動,因此不能用這種方法調試服務的 OnStart 方法中的代碼,或調試用于加載服務的 Main 方法中的代碼。(不斷循環的那塊代碼當然可以調試,只是不能調試初始化 服務運行環境的 線程的代碼,和服務線程中初始化部分代碼(初始化代碼往往比較短,當然這里可以設置sleep實現增加執行時間的目的); )
?? 2.解決此問題的一個方法是:在唯一作用是幫助調試的服務應用程序中創建一個臨時服務??梢詫蓚€服務都安裝上,然后啟動此“虛擬”服務加載服務進程。臨時服務啟動了進程后,就可以使用 Visual Studio 中的“調試”菜單來附加到服務進程。當附加該進程之后,可以設置斷點并使用這些斷點來調試代碼。當退出用于附加到該進程的對話框時,實際上已處于調試模式。您可以使用“服務控制管理器”開始、停止、暫停和繼續您的服務,因此命中已設置的斷點。調試成功后,移除此“虛擬”服務。 (剛開始看的時間一直沒看明白,現在初步理解了,就是在一個Solution里面創建再創建一個臨時服務項目,將這個項目與要調試的項目一同編譯安裝到系統服務中(此時有了連個服務A和B),然后先啟動臨時服務A,并附加到該服務A的進程,此時VS整個Solution進入調試狀態了,這就是臨時服務的目的了.現在狀態下其實VS不僅在監視著服務A進程,而且在此時啟動服務B的進程的話VS也會自動地附加上,因此我們可以自由地在任何地方設置斷點了,哈哈 ;其實并非一定要是個臨時服務項目,只要是個不停執行不會自動結束的項目應該都是可以的,目的就是讓VS進入Debug狀態,能夠自動附加上進程B就可以了 )
??? 3.DbgBreakPoint 或者 DebugBreak(在x86機器上加入一條int 3匯編指令)(相當于在編譯后的程序中增加了調試異常,在程序到達斷點時會自動跳出即時調試窗口,和普通程序出錯時的窗口相似,只要選擇調試并選擇打開了源碼VS進行調試即可,有點像以前開發JS及動態網站用的調試方法,本人認為這種方法最簡單可行了,推薦一下 )
?? 注意了:調試 OnStart 方法可能比較困難,因為 Windows 服務管理器將所有嘗試啟動服務的時間限制在 30 秒內。(這點是Windows固定的時間,估計應該有地方能夠修改該限制,不過本人沒有找到,有同學找到了告訴俺哈,:-),現在我們做的最好是把初始化服務運行環境的代碼盡可能簡化,把與服務實際相關的信息初始化,放在服務主函數中執行好了 .否則那你只會有30秒鐘時間看前面代碼的運行了,如果有自信那么快完成調試的話也可以寫前面了,本人能力是不是很足了,囧 )
轉載于:https://www.cnblogs.com/dongzhiquan/archive/2010/07/30/1994584.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Windows服务程序的调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于P2P协议通信模式的选型(一)
- 下一篇: ARM assembly instruc