當你寫了一個Windows服務的程式,然後你把這個服務安裝到你的電腦上,如果這個服務程式有一些邏輯錯誤,沒有按照你設想的執行。你想進行調試,但是又不知道如何下手,因為它跟其他的普通程式調試是不一樣的。這裡介紹兩種方法。
第一方法:
這種方法其實說起來不叫調試,也是一種笨辦法,就是用MessageBox把一些程式的中間資訊輸出來,方便你找出程式是在哪個地方出問題了,你也可以在try catch中使用,用MessageBox把異常彈出來,這種方法也比較直觀。可惜,實現起來也有問題。我們首先要添加using System.Windows.Forms;的引用,然後加上一行代碼MessageBox.Show(ex.ToString(), "Error");本以為這樣說行了,可是把服務重新編譯產生,並安裝啟動後,它並沒有彈出框來。百思不得其解。幸好,在服務的程式裡面,啟用了系統的日誌,它會把相關的異常記錄到系統日誌中去,在“電腦管理”的“事件檢視器”裡面可以找到。果然發現了一個,
顯示的資訊是
“當應用程式不是以 UserInteractive 模式運行時顯示模式對話方塊或表單是無效操作。請指定 ServiceNotification 或 DefaultDesktopOnly 樣式,以顯示服務應用程式發出的通知。”
直接百度,找到了一個答案,原來是調用MessageBox時,還需要設定它的MessageBoxOptions屬性為DefaultDesktopOnly。修改如下:
MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
然後再次重新編譯,安裝並啟動,OK,順利的彈出了錯誤的資訊。
第二種方法:
第二種方法就是真正的調試,其實Windows服務還是可以調試的,應該說任何一種類型的程式都應該能調試,別人在開發編譯器的時候就人考慮到的。下面來看具體的方法。
我們知道,任何一個程式都有一個對應的進程,如果你的Windows服務啟動後,也會有一個對應的進程。通過工作管理員,就能看到。
我們可以通過VS編譯器裡面,提供的“附加到進程”這個功能來進行調試。首先你開啟你的Windows服務來源程式,在裡面設定一個斷點,例如在OnStart方法中protected override void OnStart(string[] args){}中,然後把你的服務啟動,啟動過後,在VS的“調試”一欄中找到“附加到進程”
在進程列表裡面找到你的進程,
如果沒有的話,就把左下角的“顯示所有使用者的進程”前面的勾選中,然後你就可以找到你的Windows服務的進程了,然後點擊確定即可。
點擊確定後,可能你等了半天,也沒看見它命中斷點。哈哈,不要急,前面說漏了一點,我們是先啟動的服務,然後再附加的進程,因為服務一啟動,就會執行OnStart方法,這時,我們還沒有把這個服務的進程附加到VS中去呢?所以在OnStart方法中設定的這個斷點肯定不會命中。所以我們需要想個辦法,也就是加一個定時器,我們在OnStart方法中啟動這個定時器,然後設定這個定時器的時間間隔為1分鐘,然後在這個定時器的事件中去設定一個斷點。這樣把服務重建,安裝並啟動後,把這個進程附加到VS中去,1分鐘過後,你就會看到,它命中了斷點。不過有一個前提就是,你必須在1分鐘內把這個進程附加到VS中去,否則的話,它還是命中不了。
如果還有問題的話,就檢查一下,看你的Windows服務是不是在Release模式下產生的,如果是的話,要把它改成在Debug模式下產生。
詳細的說明,可以參考這篇文章Windows服務(附服務開發協助工具輔助)