当用绑定方法调用时,PyObject\u调用segfaults

2024-09-30 02:23:38 发布

您现在位置:Python中文网/ 问答频道 /正文

PyObject_Callsegfaults在使用绑定方法的实例调用时出错,但在使用常规(未绑定)过程或实现__call__的类的实例或type的子类调用时工作正常。你知道吗

有什么理由它应该这样工作,或者这是一个错误?行为在v3.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.parseDefParser.update_definition不是完全随机的,但也不是完全相关的:它们是最近被调用的方法。也就是说,我怀疑PyObject_Call本身是无罪的,这只是表示方法对象的方式。。。不知什么原因,我似乎失去了参考,而是坚持垃圾。。。你知道吗


Tags: of实例方法内容objectsparse过程update
1条回答
网友
1楼 · 发布于 2024-09-30 02:23:38

大量的调查发现了实际的错误。它最终与PyObject_Call无关,但它可能会帮助其他可能遇到这种情况的人。你知道吗

PyObject_Call是pythoncapi之一,用于分配内存。Python的内存分配器将有机会调用GC。我不确定它何时决定这样做,但最终会发生。GC将尝试释放Python对象分配的内存。你知道吗

在我的例子中发生了什么:有一个使用正则malloc分配的字符串,我错误地计算了终止空字节的位置(在某些情况下,它会出现在我请求分配的内存之后的一个位置)。这个内存随后被用来创建Pythonbytes对象。稍后,当GC取消分配这个对象时,它会出错。你知道吗

相关问题 更多 >

    热门问题