前一阵子做一个项目,封装了Libtorrent这个BT库,然后我把它封装了一下,导出了几个函数,然后奇怪的发现,在LoadLibrary这个封装好的DLL时候,程序发生了死锁,就是在LoadLibrary该DLL的时候,程序无论如何也执行不下去了。
这时候我们一般的思路是调试一下该DLL,于是我也这样做了,结果我惊奇的发现,DllMain没有被调用,也就是说,程序在调用DllMain之前就死掉了。
于是我想,会不会是LoadLibrary找不到DllMain的入口点,于是我在项目的设置里手动设置了DllMain,结果,程序运行下去了。。。
到这里,也许大家以为这个问题已经解决了,但是事实上,程序虽然执行下去了,但却产生了很多不正确的结果,我再次打开DLL工程调试,结果发现,很多全局对象没有初始化,这时候我恍然大悟,于是我在某个对象的构造函数上设了断点,果不其然的,该构造函数没有被执行,到这里,不知道大家是否想到了死锁的真正原因。
死锁的真正原因就是,程序在调用DllMain之前,会调用全局对象的构造函数创建对象,而恰恰在构造该对象的时候,程序死掉了,所以DllMain还没来得及执行,程序就死锁了,至于为什么该对象定义成全局变量以后就会死锁,超出了本文讨论的范围,在此不做阐述。
此文只是给大家提供一个简单的思路,当发生了类似的奇怪状况时,该如何解决。另外想说的是,没有解决不了的问题,只有懒惰的人,只要你坚持探索真相,问题总是能水落石出。