一个LoadLibrary导致程序死机的Bug的诊断

前一阵子做一个项目,封装了Libtorrent这个BT库,然后我把它封装了一下,导出了几个函数,然后奇怪的发现,在LoadLibrary这个封装好的DLL时候,程序发生了死锁,就是在LoadLibrary该DLL的时候,程序无论如何也执行不下去了。

这时候我们一般的思路是调试一下该DLL,于是我也这样做了,结果我惊奇的发现,DllMain没有被调用,也就是说,程序在调用DllMain之前就死掉了。

于是我想,会不会是LoadLibrary找不到DllMain的入口点,于是我在项目的设置里手动设置了DllMain,结果,程序运行下去了。。。

到这里,也许大家以为这个问题已经解决了,但是事实上,程序虽然执行下去了,但却产生了很多不正确的结果,我再次打开DLL工程调试,结果发现,很多全局对象没有初始化,这时候我恍然大悟,于是我在某个对象的构造函数上设了断点,果不其然的,该构造函数没有被执行,到这里,不知道大家是否想到了死锁的真正原因。

死锁的真正原因就是,程序在调用DllMain之前,会调用全局对象的构造函数创建对象,而恰恰在构造该对象的时候,程序死掉了,所以DllMain还没来得及执行,程序就死锁了,至于为什么该对象定义成全局变量以后就会死锁,超出了本文讨论的范围,在此不做阐述。

此文只是给大家提供一个简单的思路,当发生了类似的奇怪状况时,该如何解决。另外想说的是,没有解决不了的问题,只有懒惰的人,只要你坚持探索真相,问题总是能水落石出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值