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