glibc 检测到 *** free(): 无效指针:Python c++ 和 Swig
我需要运行一些用Python写的单元测试。我们有用C++写的代码要测试,所以我把它编译成了一个共享对象,并使用swig提供了一个接口,让Python脚本可以调用必要的API进行测试。
现在,当我运行其中一个Python脚本时(显然它在访问我想测试的C++代码),我收到了一个“glibc检测到free(): 无效指针”的错误。根据我的理解,这里有一些内存问题,可能是重复释放内存或者我在释放一块无法访问的内存。现在我想请教各位专家:
1] 我没有得到任何回溯信息(甚至没有行号),有没有办法知道问题发生在哪里?我只看到脚本在某个点突然停止,并打印出类似这样的信息:
*** glibc detected * free(): invalid pointer: 0x099e9b28 ***
我能否通过设置某个标志来获取回溯信息?
2] 我运行了valgrind:
"valgrind --leak-check=yes ./myscript.py"
但没有得到太多信息,只有一些行:
glibc detected free(): invalid pointer: 0x099e9b28
==25728==
==25728== 条件跳转或移动依赖于未初始化的值
==25728== 在 0x625AEA: PyObject_Free (在 /usr/lib/libpython2.3.so.1.0)
==25728== 在 0x614C7F: (在 /usr/lib/libpython2.3.so.1.0)
==25728== 在 0x61EA53: (在 /usr/lib/libpython2.3.so.1.0)
基本上我没有得到与我的代码相关的信息。那么我在使用valgrind时还有其他需要做的事情吗?
3] 我尝试了printf,但没有找到任何有用的信息。
4] 我尝试了gdb:
prompt>gdb python
gdb> set args myscript.py
gdb> run
这会运行脚本,但我无法设置任何断点,它直接运行并打印出错误。没有绝对的帮助。我在使用GDB时还有其他需要做的事情吗?有没有办法设置断点?
非常感谢你们能给我的任何指点。
2 个回答
我成功地用谷歌的堆检查工具来调试这种问题。这个工具可以告诉你内存分配和释放的具体位置,也就是它会显示出相关的调用记录。
我终于搞明白了!我执行了这个命令:
ulimit -c unlimited
执行完这个命令后,我看到了一个核心转储文件,现在我可以通过这个命令来分析它:
gdb /usr/bin/python2.3 core.31685