一個LoadLibrary導致程式宕機的Bug的診斷
阿新 • • 發佈:2019-02-09
前一陣子做一個專案,封裝了Libtorrent這個BT庫,然後我把它封裝了一下,匯出了幾個函式,然後奇怪的發現,在LoadLibrary這個封裝好的DLL時候,程式發生了死鎖,就是在LoadLibrary該DLL的時候,程式無論如何也執行不下去了。
這時候我們一般的思路是除錯一下該DLL,於是我也這樣做了,結果我驚奇的發現,DllMain沒有被呼叫,也就是說,程式在呼叫DllMain之前就死掉了。
於是我想,會不會是LoadLibrary找不到DllMain的入口點,於是我在專案的設定裡手動設定了DllMain,結果,程式執行下去了。。。
到這裡,也許大家以為這個問題已經解決了,但是事實上,程式雖然執行下去了,但卻產生了很多不正確的結果,我再次開啟DLL工程除錯,結果發現,很多全域性物件沒有初始化,這時候我恍然大悟,於是我在某個物件的建構函式上設了斷點,果不其然的,該建構函式沒有被執行,到這裡,不知道大家是否想到了死鎖的真正原因。
死鎖的真正原因就是,程式在呼叫DllMain之前,會呼叫全域性物件的建構函式建立物件,而恰恰在構造該物件的時候,程式死掉了,所以DllMain還沒來得及執行,程式就死鎖了,至於為什麼該物件定義成全域性變數以後就會死鎖,超出了本文討論的範圍,在此不做闡述。
此文只是給大家提供一個簡單的思路,當發生了類似的奇怪狀況時,該如何解決。另外想說的是,沒有解決不了的問題,只有懶惰的人,只要你堅持探索真相,問題總是能水落石出。