PyObject_Call
segfaults在使用绑定方法的实例调用时出错,但在使用常规(未绑定)过程或实现__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.parse
和DefParser.update_definition
不是完全随机的,但也不是完全相关的:它们是最近被调用的方法。也就是说,我怀疑PyObject_Call
本身是无罪的,这只是表示方法对象的方式。。。不知什么原因,我似乎失去了参考,而是坚持垃圾。。。你知道吗
大量的调查发现了实际的错误。它最终与
PyObject_Call
无关,但它可能会帮助其他可能遇到这种情况的人。你知道吗PyObject_Call
是pythoncapi之一,用于分配内存。Python的内存分配器将有机会调用GC。我不确定它何时决定这样做,但最终会发生。GC将尝试释放Python对象分配的内存。你知道吗在我的例子中发生了什么:有一个使用正则
malloc
分配的字符串,我错误地计算了终止空字节的位置(在某些情况下,它会出现在我请求分配的内存之后的一个位置)。这个内存随后被用来创建Pythonbytes
对象。稍后,当GC取消分配这个对象时,它会出错。你知道吗相关问题 更多 >
编程相关推荐