1

我必须运行一些用 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检测到free():无效指针:0x099e9b28
==25728==
== 25728== 条件跳转或移动取决于未初始化的值
==25728== 在 0x625AEA: PyObject_Free (in /usr/lib/libpython2.3.so.1.0)
==25728== by 0x614C7F: (within /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> set args myscript.py
gdb> run

这运行脚本,我无法设置任何断点,它运行并打印错误。没有绝对的帮助。我还应该对 GDB 做些什么吗?有什么方法可以设置断点?

非常感谢你们能给我的任何指示。

4

2 回答 2

1

我终于想通了!我执行了命令
ulimit -c unlimited

在此之后我看到一个核心转储,现在我可以通过
gdb /usr/bin/python2.3 core.31685对其进行分析

于 2013-03-07T06:48:24.340 回答
0

我已经使用 Google 的heap checker成功调试了此类问题。它将为您提供分配点和解除分配点的堆栈跟踪。

于 2013-03-06T20:40:29.077 回答