一個LoadLibrary導致程序死機的Bug的診斷

前一陣子做一個項目,封裝了Libtorrent這個BT庫,然後我把它封裝了一下,導出了幾個函數,然後奇怪的發現,在LoadLibrary這個封裝好的DLL時候,程序發生了死鎖,就是在LoadLibrary該DLL的時候,程序無論如何也執行不下去了。

這時候我們一般的思路是調試一下該DLL,於是我也這樣做了,結果我驚奇的發現,DllMain沒有被調用,也就是說,程序在調用DllMain之前就死掉了。

於是我想,會不會是LoadLibrary找不到DllMain的入口點,於是我在項目的設置裏手動設置了DllMain,結果,程序運行下去了。。。

到這裏,也許大家以爲這個問題已經解決了,但是事實上,程序雖然執行下去了,但卻產生了很多不正確的結果,我再次打開DLL工程調試,結果發現,很多全局對象沒有初始化,這時候我恍然大悟,於是我在某個對象的構造函數上設了斷點,果不其然的,該構造函數沒有被執行,到這裏,不知道大家是否想到了死鎖的真正原因。

死鎖的真正原因就是,程序在調用DllMain之前,會調用全局對象的構造函數創建對象,而恰恰在構造該對象的時候,程序死掉了,所以DllMain還沒來得及執行,程序就死鎖了,至於爲什麼該對象定義成全局變量以後就會死鎖,超出了本文討論的範圍,在此不做闡述。

此文只是給大家提供一個簡單的思路,當發生了類似的奇怪狀況時,該如何解決。另外想說的是,沒有解決不了的問題,只有懶惰的人,只要你堅持探索真相,問題總是能水落石出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章