【问题标题】:glibc detected *** free(): invalid pointer: Python c++ and Swigglibc 检测到 *** free():无效指针:Python c++ 和 Swig
【发布时间】:2013-03-06 19:14:28
【问题描述】:

我必须运行一些用 Python 编写的单元测试。我们有在 C++ 中测试的代码,所以我将它编译成一个共享对象,并使用 swig 为 python 脚本提供一个接口来调用必要的 api 进行测试。

现在,当我运行其中一个 python 脚本(它显然正在访问我打算测试的 c++ 代码库)时,我得到一个“glibc 检测到 free():无效指针”。现在我确实明白存在一些内存问题,要么是双重释放,要么我正在释放无法访问的内存。现在我向各位专家提出的要求:

1] 我没有得到任何回溯(甚至没有行号),是否知道问题出在哪里?除了脚本在某个时候突然停止并打印类似这样的内容之外,我没有得到任何信息
*** glibc 检测到 * free():无效指针:0x099e9b28 ***
我能以某种方式获得回溯吗?通过设置一些标志可能是什么?

2] 我跑了 valgrind:
“valgrind --leak-check=yes ./myscript.py”
我没有得到太多东西,从中得到了一些东西:
glibc 检测到 free():无效指针:0x099e9b28
==25728==
==25728== 条件跳转或移动取决于未初始化的值
==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> 设置参数 myscript.py
gdb> 运行

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

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

【问题讨论】:

  • 我不知道怎么用GDB,但是我用Visual Studio调试过这样的问题。我所做的是在脚本的开头添加一个input 语句来暂停它。当它在那里暂停时,在 VS 中加载 DLL(或 .so)项目时,我将其附加到 python.exe。现在你可以在你的 C++ 代码中设置断点,当错误被抛出时,调试器甚至会自动中断。
  • 感谢您的回复。我试过了我正在使用命令行gdb,当我添加输入时,它期望输入,我应该如何设置断点?我的意思是我在期望输入时输入的任何内容都会被解释为输入。因此我不能设置断点。还有什么我应该做的吗?
  • 嗯,VS 工作流程明显不同。当 python 脚本暂停时(期待用户输入),您可以与 VS IDE 交互并设置断点(在附加到正在运行的 python 进程之后)。然后你按回车键恢复脚本执行。我不知道这如何转化为使用 GDB。

标签: c++ python swig


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-08-01
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2015-03-31
      • 1970-01-01
      • 2016-03-27
      • 2016-03-28
      相关资源
      最近更新 更多