【问题标题】:Bus error in Python with C extension带有 C 扩展名的 Python 中的总线错误
【发布时间】:2013-04-17 07:35:16
【问题描述】:

最近我一直在编写带有 C 扩展名的 python 模块。 (python2.7, gcc 4.1.2) 一旦完成并测试。我发现以下总线错误。

有人知道为什么吗?

ps 在我收到此错误之前。我修复了

中描述的“返回 Py_False 相关错误”

Application gives segmentation fault randomly in python extension functions in c++

核心由python2.7 app.py --debug=False --multi_slaves=True生成

程序以信号 7 终止,总线错误。
#0 0x0000003d22272cf1 in _int_malloc () from /lib64/libc.so.6
(gdb) 哪里
#0 0x0000003d22272cf1 in _int_malloc () from /lib64/libc.so.6
#1 0x0000003d22274e4e in malloc () from /lib64/libc.so.6
#2 0x00000000004d3069 in _PyObject_GC_Malloc (basicsize=<value optimized out>) 在 Modules/gcmodule.c:1445
#3 0x000000000046408c 在 PyType_GenericAlloc (type=0x768360, nitems=0) at Objects/typeobject.c:753
#4 0x00000000004477ec in dict_new (type=0x3d225539e0, args=, kwds=0x7fff8dcb4eb0) 在 Objects/dictobject.c:2301
#5 0x00000000004661c3 in type_call (type=0x3d225539e0, args=0x2b3e5a521050, kwds=0x2239bca0) 在 Objects/typeobject.c:721
#6 0x00000000004189cd in PyObject_Call (func=0x768360, arg=0x2b3e5a521050, kw=0x2239bca0) at Objects/abstract.c:2529

c 扩展代码如下所示

static PyObject* analyze( PyObject *self, PyObject *args )
{
    int     ret;
    char*   in;

    // global variables : void* obj, char* outbuf, int outbuf_size;
    if (PyArg_ParseTuple(args, "s", &in)){
        ret = process(obj, in, outbuf, outbuf_size);
        if ( ret == SUCCESS ) {
            PyObject* py_out = PyString_FromString(outbuf);
            return py_out;
        } else {
            Py_INCREF(Py_False);
            return Py_False;
        }
    } else {
        Py_INCREF(Py_False);
        return Py_False;
    }
}

~

【问题讨论】:

  • 这看起来很像你的模块搞砸了。可以发complete source code of a module that exhibits the problem吗?
  • c扩展模块,先初始化void* obj,然后调用analyze(obj, in, ...)。问题出现在这里。
  • 虽然问题出现在analyze,但实际错误很可能在完全不同的地方(例如,双重free)。您能否发布仍然存在问题的完整代码?此外,示例代码显然无效 - outbuf 从未声明过。
  • 我认为通常的做法是使用--debug=True 编译并通过调试器运行您的代码;这至少应该为您提供崩溃的确切点。
  • @phihag outbuf 是全局变量。并且 process() 是很长的 c 代码。所以在这里发帖是不合适的。对不起^^;;

标签: python c


【解决方案1】:

FWIW 我从 python 程序中得到一个总线错误。原来与它分配共享内存有关。我在 docker 容器中运行它,并且必须设置 docker run ... --shm_size=1g,如下所述: https://goblincoding.com/2018/02/19/docker-bus-error-no-space-left-on-device/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多