代码之家  ›  专栏  ›  技术社区  ›  wvxvw

使用绑定方法调用时,pyobject_调用segfults

  •  -1
  • wvxvw  · 技术社区  · 8 年前

    PyObject_Call 当使用绑定方法的实例调用StError时,当使用常规(未绑定)过程或实现的类的实例调用时,它工作得很好。 __call__ ,或具有 type .

    有什么理由它应该像这样工作,还是这是一个错误?行为在v 3.5和v3.6之间是一致的。没有尝试以前的版本。

    在这个场景中生成的stacktrace甚至不包含我的代码。不过,如果重要的话,坠机发生在车内

    method_dealloc () at Objects/classobject.c:194
    

    看起来是这样的: https://github.com/python/cpython/blob/master/Objects/classobject.c#L194

    为了避免直接的问题:是的,我打电话给 Py_INCREF(callable) 在调用此过程之前。


    更多信息

    当我试图查看此呼叫中发送的内容时,我看到如下内容:

    found method: <bound method DefParser.parse of <bound method DefParser.update_definition of <NULL>>>
    

    这个 DefParser.parse DefParser.update_definition 不是完全随机的,但也不是完全相关的:它们是最近调用的方法。我怀疑 PyObject调用 它本身并不有罪,它只是方法对象的表示方式…出于某种原因,我似乎失去了参考,而是坚持垃圾…

    1 回复  |  直到 8 年前
        1
  •  -1
  •   wvxvw    8 年前

    许多调查发现了实际的错误。它与 PyObject_Call 最后,但它可能会帮助其他可能遇到这种情况的人。

    PyObject调用 是分配内存的Python C API之一。Python的内存分配器将机会性地调用GC。我不确定它什么时候决定这么做,但最终还是会发生的。GC将尝试释放Python对象分配的内存。

    在我的例子中发生了什么:有一个字符串使用regular分配 malloc ,在这里,我错误地计算了终止空字节的位置(在某些情况下,它将出现在我请求分配的内存之后的一个位置)。然后用这个内存创建一个Python。 bytes 对象。稍后,当gc取消分配这个对象时,它将出现seagfault。

    推荐文章