我必须运行一些用Python编写的单元测试。我们有用c ++进行测试的代码,所以我将它编译成一个共享对象,并使用swig为python脚本提供一个接口,以调用必要的api来测试。
现在,当我运行其中一个python脚本(显然是访问我打算测试的c ++代码库)时,我得到了一个“glibc detect free():无效指针”。现在我明白了存在一些内存问题,无论是双重免费还是我正在释放无法访问的内存。现在我要求你的专家:
1]我没有得到任何回溯(甚至没有行号),无论如何都知道问题发生在哪里?我没有得到任何信息,除了脚本在某些时候突然停止并打印这样的东西
*** glibc检测到 * free():指针无效:0x099e9b28 ***
我能以某种方式获得回溯吗?通过设置一些标志可能?
2]我跑了valgrind:
“valgrind --leak-check = yes ./myscript.py”
我没有得到太多东西,从中得到一些线索:
glibc检测到free():无效指针:0x099e9b28
== == 25728
== 25728 ==有条件的跳跃或移动取决于未初始化的值(s)
== 25728 ==在0x625AEA:PyObject_Free(在/usr/lib/libpython2.3.so.1.0)
== 25728 == by 0x614C7F :(在/usr/lib/libpython2.3.so.1.0内)
== 25728 == by 0x61EA53 :(在/usr/lib/libpython2.3.so.1.0内)
我基本上没有得到任何与我的代码相关的内容。那么我应该对valgrind做些什么。
3]我试过printfs,它实际上并没有把我带走
4]我试过gdb:
提示> gdb python
GDB>设置args myscript.py
GDB>跑
这会运行脚本,我无法设置任何断点,它会运行并打印错误。没有绝对的帮助。我还应该用GDB做些什么吗?有没有办法设置断点?
非常感谢你们给我的任何指针。
答案 0 :(得分:1)
我终于想通了!我执行了命令
ulimit -c unlimited
在此之后,我看到核心转储,现在我可以通过
分析它
gdb /usr/bin/python2.3 core.31685
答案 1 :(得分:0)
我已使用Google的heap checker成功调试了此类问题。它将为您提供分配和释放的堆栈跟踪。