做爲程序員,開發程序是基本功,而調試程序也是必不可少的技能之一。軟件在主體功能開發完成後會經歷各個階段的測試,纔會被髮布。在測試過程當中,出現較多的可能就是內存泄漏,句柄泄漏,異常崩潰等屬於非功能型的軟件Bug。而Windows做爲一個至關成熟的平臺,對於軟件的調試也支持很到位。今天想要記錄的是此次調查的一個模塊的句柄泄漏問題。程序員
關於句柄泄漏的文章網上不少,不少關於調試的書籍中也有說明,並且有些也比較詳細。以前也解決過這類的問題,因此絕不在乎。先介紹一下基本狀況:工做機是Windows 7 64bit 專業版SP1,Windbg使用的是32bit的版本,出問題模塊是32bit,依賴也多個外部模塊,均爲32bit,且自身包含了dbghelp.dll(後面介紹爲何單獨說這個)。函數
照着Bug的描述,開始操做前搞上Windgb,設置好pdb,!htrace開啓。操做了一番,在任務管理器中,發現被調試模塊的句柄數蹭蹭蹭往上漲,中止操做後也沒見有回落的跡象。見此情形,只好斷入Windbg看看狀況,看到!htrace -diff輸入後顯示的結果立馬傻眼了。全都是虛地址,沒有任何堆棧信息,立馬想到是否是pdb不對,lmvm一看,顯示正確。可是k顯示的堆棧確實是有被調試模塊的堆棧。一時想不到問題出在哪,那麼就本身寫個demo,看下是否是同樣,寫完demo掛上windbg,狀況竟然同樣!這是感受就有點詭異,問題應該不是出在被調試程序上,就度娘了一把,無任何發現。卻是在高端調試網站上有人發了個帖子,情況和我同樣,可是沒人回答怎麼解決,無果。翻閱書籍,看到的都是千篇一概的,對於上述碰到的問題,無任何說起,無果。偶然在網上找到個工具http://pan.baidu.com/s/1jGIopqm,能夠檢測內存泄漏、句柄泄漏。將上面寫的demo用上後,確實如實反映出了事件的泄漏點,感受不錯。而後就把出問題的模塊用上。Inject的時候爆出一個錯誤,說被調試進程已經加載過dbghelp.dll。也就是上面特別說起的那點,無果。工具
想來想去,後來乾脆就上了個64bit的Windbg,在調試32bit的demo時,!htrace -diff竟然顯示了幾行堆棧,切換到x86模式下顯示,確實顯示了CreateEvent字眼,瞬間好像明白了什麼。把demo編譯條件切換到64bit,用64bit windbg再試,堆棧所有顯示。而後就將泄漏的模塊裝在32bit機子上,用32bit windbg一看。未關閉句柄的堆棧全有了。至此水落石出。測試
爲何在64bit機器上,32bit的windbg調試32bit的進程,通常的函數調用,都可以顯示堆棧,而對於差別的句柄堆棧,卻不顯示,沒有答案。通過這一次發現,只關注問題的自己很重要,但有時每每會被一切外部的因素干擾到咱們對事物的判斷,這時候就應該站在一個高的高度,看待這問題,那麼一切都明瞭了。網站