windows下,Python加载的dll怎么调试?

一入程序深似海 2014-08-25 11:10:01
用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过吗?

大家讨论一下,这个问题改怎么解决?



...全文
352 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 openXMPP 的回复:
你的Python也是自己编译的吗? python有对应的VS的版本 也就是说 你自己编译的dll最好也是有对应的版本的 曾经编过pcap的windows64位release版本 没遇见你说的问题
python 不是我自己编译的,dll是用scons 编译的,环境下没有vs可用。 貌似找到原因了,之前有多个dll,每个dll都是 /MT 选项编译链接的,这导致每份dll中都有一份 _crtheap 的堆管理,导致内存分配和释放出了问题。现在我把2个dll编译成一个dll,问题解决了。 哎,windows。 结贴
乔巴好萌 2014-08-26
  • 打赏
  • 举报
回复
你的Python也是自己编译的吗? python有对应的VS的版本 也就是说 你自己编译的dll最好也是有对应的版本的 曾经编过pcap的windows64位release版本 没遇见你说的问题

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧