2013-03-06 74 views
1

我必须运行一些用Python编写的单元测试。我们有用C++测试的代码,所以我将它编译到一个共享对象中,并使用swig为python脚本提供一个接口来调用必要的api来测试。现在,当我运行其中一个python脚本(显然是访问我打算测试的C++代码库)时,我得到一个“glibc free free():invalid pointer”。现在我明白,有一些内存问题,无论是免费还是释放一个无法访问的内存。现在我要求你的专家:glibc detected *** free():无效指针:Python C++和Swig

1]我没有得到任何回溯(甚至没有行号),有无论如何知道问题发生在哪里?我没有得到比脚本在某个时刻突然停止并打印这样的事情
*** glibc的其他任何信息检测到*免费():无效的指针:0x099e9b28 ***
我可以得到一个回溯不知何故?通过设置一些标志可能是?

2]我的valgrind跑:
“的valgrind --leak检查= YES ./myscript.py”
我没有得到的东西多了,从它的一些线路:
glibc的检测免费():无效指针:0x099e9b28
== 25728 ==
== 25728 ==条件跳转或移动取决于未初始化值(S)
==在0x625AEA 25728 ==:PyObject_Free(在/usr/lib/libpython2.3。 so.1.0)
== 25728 == by 0x614C7F :(在/usr/lib/libpython2.3.so.1.0内)
== 25728 == by 0x61 EA53 :(在/usr/lib/libpython2.3.so.1.0内)

我没有得到任何与我的代码基本相关的任何东西。那么还有什么我应该用valgrind做的。

3]我试过printfs,它实际上没有带任何东西。
4]我试图GDB:
提示> GDB蟒蛇
GDB>集ARGS myscript.py
GDB>运行

这将运行脚本,我不能设置任何断点,它运行并打印错误。没有绝对的帮助。还有什么我应该做的GDB?任何方式来设置断点?

非常感谢你们可以给我的任何一种指针。

+0

我不知道它分析如何使用GDB,但是我使用Visual Studio调试了这些问题。我所做的是在脚本的开头添加一个'input'语句来暂停它。当它暂停时,在VS中加载DLL(或.so)项目,我将它附加到python.exe。现在,您可以在C++代码中设置断点,并且在引发错误时调试器甚至可能会自动断开。 – Praetorian 2013-03-06 19:23:43

+0

感谢您的回复。我试过它我正在使用命令行gdb,当我添加输入,它期待输入,我该如何设置断点?我的意思是无论我在输入什么时候输入,都会被解释为输入。因此我不能设置断点。有什么我应该做的吗? – Pkp 2013-03-06 19:38:15

+0

嗯,VS的工作流程有很大的不同。当python脚本暂停(期待用户输入)时,您可以与VS IDE进行交互并设置断点(在连接到正在运行的python进程之后)。然后你按回车键恢复脚本执行。我不知道这如何转化为使用GDB。 – Praetorian 2013-03-06 19:46:43

回答

0

我已经使用Google的heap checker成功调试过这类问题。它会为您提供分配点和释放点的堆栈跟踪。

1

我终于想通了!我执行命令
的ulimit -c无限

在这之后我看到了一个核心转储,现在我可以通过
GDB /usr/bin/python2.3 core.31685

相关问题