用C++写了一个dll,然后让python调用,debug下能正常运行,release运行的时候就crash了。
找了好多信息,也google了不少,stackflow上有很多关于“debug运行正常,和release下运行crash”的例子,但是他们都是exe的程序,crash了也好找问题。
先说一下我的环境:
OS:Windows 2008 Server
Python 2.7.3
python import xxx.dll
在执行dll里面的一个导出函数时,发生heap异常,传说中的C00000005,非法的内存访问。
dll里面主要执行的是,从底层取出一块数据,传递给一个bson对象,然后把bson的内容返回给Python。
类似于
{
bson::BSONObj obj;
getNextConfigData( obj ) ;
return Py_BuildValue("s#", obj.objdata(), obj.objsize()) ;
}
bson::BSONObj 是binary json,这个应该都了解吧。
里面的赋值,仅仅是把指向数据的指针,指向底层的数据了,也就是俗称的浅拷贝。
(其实就算是深拷贝,也会crash,我试过了)
按照Python的官方说话,Py_BuildValue是会把数据copy一份给python代码的。
也就是不存在数据因为函数返回时被析构的问题。
同样的代码,在Linux下编译出so,是可以正常执行的,换到Windows下,然后就crash了。
现在想调试dll,但是python环境上,没法attach上dll,有谁曾经试过调试第三方python扩展库的dll过吗?
大家讨论一下,这个问题改怎么解决?