Windows服務程式的除錯

2021-05-23 04:54:26 字數 1350 閱讀 2750

摘自: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秒鐘時間看前面**的執行了,如果有自信那麼快完成除錯的話也可以寫前面了,本人能力是不是很足了,囧 )

如何 除錯 Windows 服務應用程式

除非知道程序是什麼,並且知道附加到程序或可能取消程序所帶來的後果,否則不要附加到程序。例如,如果附加到 winlogon 程序,然後停止除錯,系統就會暫停,因為沒有 winlogon,系統無法執行。只能將偵錯程式附加到正在執行的服務。附加程序會中斷服務的當前執行 它並不真正終止或暫停服務的處理。也就...

windows服務程式

有時候需要windows服務程式來執行一些操作,比如需要在登陸前啟動,不想被殺軟判為自啟動,當然還是能被發現,但是殺軟的普通清理時不會清理的。但是服務程式不能進行介面互動,因為他不屬於使用者介面。他只是在後台默默的啟動,執行,對於收集資料,後台更新再合適不過了。乙個服務程式的簡單寫法 service...

windows服務程式的編寫

windows服務程式可以設定為開機執行,具有特權。乙個服務程式編寫完成後要進行安裝,然後通過本地服務的管理工具開啟,當然如果設定為開機自動執行就不用手動開啟了。服務程式不應該雙擊執行。windows服務程式需要進行安裝,也可以在服務程式的入口函式接收傳入的引數,然後進行判斷是否進行安裝,判斷接收的...