一個(gè)LoadLibrary導(dǎo)致程序死機(jī)的Bug的診斷 | 您所在的位置:網(wǎng)站首頁 › 屬猴的人方位 › 一個(gè)LoadLibrary導(dǎo)致程序死機(jī)的Bug的診斷 |
前一陣子做一個(gè)項(xiàng)目,封裝了Libtorrent這個(gè)BT庫(kù),然后我把它封裝了一下,導(dǎo)出了幾個(gè)函數(shù),然后奇怪的發(fā)現(xiàn),在LoadLibrary這個(gè)封裝好的DLL時(shí)候,程序發(fā)生了死鎖,就是在LoadLibrary該DLL的時(shí)候,程序無論如何也執(zhí)行不下去了。 這時(shí)候我們一般的思路是調(diào)試一下該DLL,于是我也這樣做了,結(jié)果我驚奇的發(fā)現(xiàn),DllMain沒有被調(diào)用,也就是說,程序在調(diào)用DllMain之前就死掉了。 于是我想,會(huì)不會(huì)是LoadLibrary找不到DllMain的入口點(diǎn),于是我在項(xiàng)目的設(shè)置里手動(dòng)設(shè)置了DllMain,結(jié)果,程序運(yùn)行下去了。。。 到這里,也許大家以為這個(gè)問題已經(jīng)解決了,但是事實(shí)上,程序雖然執(zhí)行下去了,但卻產(chǎn)生了很多不正確的結(jié)果,我再次打開DLL工程調(diào)試,結(jié)果發(fā)現(xiàn),很多全局對(duì)象沒有初始化,這時(shí)候我恍然大悟,于是我在某個(gè)對(duì)象的構(gòu)造函數(shù)上設(shè)了斷點(diǎn),果不其然的,該構(gòu)造函數(shù)沒有被執(zhí)行,到這里,不知道大家是否想到了死鎖的真正原因。 死鎖的真正原因就是,程序在調(diào)用DllMain之前,會(huì)調(diào)用全局對(duì)象的構(gòu)造函數(shù)創(chuàng)建對(duì)象,而恰恰在構(gòu)造該對(duì)象的時(shí)候,程序死掉了,所以DllMain還沒來得及執(zhí)行,程序就死鎖了,至于為什么該對(duì)象定義成全局變量以后就會(huì)死鎖,超出了本文討論的范圍,在此不做闡述。 此文只是給大家提供一個(gè)簡(jiǎn)單的思路,當(dāng)發(fā)生了類似的奇怪狀況時(shí),該如何解決。另外想說的是,沒有解決不了的問題,只有懶惰的人,只要你堅(jiān)持探索真相,問題總是能水落石出。 |
今日新聞 |
推薦新聞 |
專題文章 |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |