Python ctypes堆栈损坏

Python ctypes堆栈损坏,python,ctypes,Python,Ctypes,我对ctypes有一些奇怪的问题,它似乎在不应该引用指针的时候取消引用了指针,从而破坏了堆栈。和我呆在一起一会儿,设置相当复杂 我有一个C函数qfsm\u search,带有如下包装签名: qmotion.qfsm_search.argtypes = [ qfsm_ptr, qfsm_node_t, qskel_ptr, vec3, c_int, qfsm_node_ptr, POINTER(c_int)] qmotion.qfsm_search.

我对ctypes有一些奇怪的问题,它似乎在不应该引用指针的时候取消引用了指针,从而破坏了堆栈。和我呆在一起一会儿,设置相当复杂

我有一个C函数
qfsm\u search
,带有如下包装签名:

qmotion.qfsm_search.argtypes = [
    qfsm_ptr,
    qfsm_node_t,
    qskel_ptr,
    vec3, c_int,
    qfsm_node_ptr,
    POINTER(c_int)]
qmotion.qfsm_search.restype = None
print("Fsm: %d | %X" % (sizeof(fsm), addressof(fsm.contents)))
print("Curr: %d | %d %d %d" % (sizeof(curr), curr.state, curr.anim, curr.frame))
print("Skel: %d | %X" % (sizeof(skel), addressof(skel.contents)))
print("Tar: %f %f %f" % (tar.x, tar.y, tar.z))
print("Limit: %i" % limit)
print("Out: %X" % addressof(out_nodes_p.contents))
print("Out Num: %X" % addressof(out_num_p.contents))

qmotion.qfsm_search(fsm, curr, skel, tar, limit, out_nodes_p, out_num_p)
void qfsm_search(qfsm_t* fsm, qfsm_node_t curr, qskel_t* skel, vec3 tar, int max_out, qfsm_node_t* out, int* out_num) {

  qdebug("Fsm: %d | %p", (int)sizeof(fsm), fsm);
  qdebug("Node: %d | %d %d %d", (int)sizeof(curr), curr.state, curr.anim, curr.frame);
  qdebug("Skel: %d | %p", (int)sizeof(skel), skel);
  qdebug("Tar: %f %f %f", tar.x, tar.y, tar.z);
  qdebug("Max: %d", max_out);
  qdebug("Out: %p", out);
  qdebug("Out Num: %p", out_num);

  ....
然后我输出参数的所有细节,并在python中调用它,如下所示:

qmotion.qfsm_search.argtypes = [
    qfsm_ptr,
    qfsm_node_t,
    qskel_ptr,
    vec3, c_int,
    qfsm_node_ptr,
    POINTER(c_int)]
qmotion.qfsm_search.restype = None
print("Fsm: %d | %X" % (sizeof(fsm), addressof(fsm.contents)))
print("Curr: %d | %d %d %d" % (sizeof(curr), curr.state, curr.anim, curr.frame))
print("Skel: %d | %X" % (sizeof(skel), addressof(skel.contents)))
print("Tar: %f %f %f" % (tar.x, tar.y, tar.z))
print("Limit: %i" % limit)
print("Out: %X" % addressof(out_nodes_p.contents))
print("Out Num: %X" % addressof(out_num_p.contents))

qmotion.qfsm_search(fsm, curr, skel, tar, limit, out_nodes_p, out_num_p)
void qfsm_search(qfsm_t* fsm, qfsm_node_t curr, qskel_t* skel, vec3 tar, int max_out, qfsm_node_t* out, int* out_num) {

  qdebug("Fsm: %d | %p", (int)sizeof(fsm), fsm);
  qdebug("Node: %d | %d %d %d", (int)sizeof(curr), curr.state, curr.anim, curr.frame);
  qdebug("Skel: %d | %p", (int)sizeof(skel), skel);
  qdebug("Tar: %f %f %f", tar.x, tar.y, tar.z);
  qdebug("Max: %d", max_out);
  qdebug("Out: %p", out);
  qdebug("Out Num: %p", out_num);

  ....
这将在python端输出以下内容。到目前为止,一切似乎都很好

Fsm: 8 | 13CF0960
Curr: 12 | 0 0 89
Skel: 8 | 49193E60
Tar: 100.000000 100.000000 100.000000
Limit: 5
Out: 39A4FD10
Out Num: 2D623510
在C中,我有如下函数:

qmotion.qfsm_search.argtypes = [
    qfsm_ptr,
    qfsm_node_t,
    qskel_ptr,
    vec3, c_int,
    qfsm_node_ptr,
    POINTER(c_int)]
qmotion.qfsm_search.restype = None
print("Fsm: %d | %X" % (sizeof(fsm), addressof(fsm.contents)))
print("Curr: %d | %d %d %d" % (sizeof(curr), curr.state, curr.anim, curr.frame))
print("Skel: %d | %X" % (sizeof(skel), addressof(skel.contents)))
print("Tar: %f %f %f" % (tar.x, tar.y, tar.z))
print("Limit: %i" % limit)
print("Out: %X" % addressof(out_nodes_p.contents))
print("Out Num: %X" % addressof(out_num_p.contents))

qmotion.qfsm_search(fsm, curr, skel, tar, limit, out_nodes_p, out_num_p)
void qfsm_search(qfsm_t* fsm, qfsm_node_t curr, qskel_t* skel, vec3 tar, int max_out, qfsm_node_t* out, int* out_num) {

  qdebug("Fsm: %d | %p", (int)sizeof(fsm), fsm);
  qdebug("Node: %d | %d %d %d", (int)sizeof(curr), curr.state, curr.anim, curr.frame);
  qdebug("Skel: %d | %p", (int)sizeof(skel), skel);
  qdebug("Tar: %f %f %f", tar.x, tar.y, tar.z);
  qdebug("Max: %d", max_out);
  qdebug("Out: %p", out);
  qdebug("Out Num: %p", out_num);

  ....
但该函数输出:

Fsm: 8 | 0000000013CF0960
Node: 12 | 0 0 89
Skel: 8 | 000000000D6281A8
Tar: 0.000000 0.000000 14144512.000000
Max: 967112848
Out: 000000000D628468
Out Num: 0000000000000005
请注意
skel
参数的值是如何更改的,堆栈在损坏后会随之更改。我认为ctypes取消引用
skel
参数的原因是,如果我将
skel
设置为空指针,那么在输入C函数和打印任何调试信息之前,我会得到一个空指针segfault

有人知道会发生什么吗?我怀疑类型
qskel_ptr
可能存在一些奇怪的问题,但这似乎不太可能,因为我在传递空指针时解释了这种行为

可能值得一提的是,我正在运行Windows 7 64位和Python 2.6.4。我还成功地在Python2.7.3上重现了这种行为


非常感谢

很抱歉无法提供更多帮助-但有一个很好的提示,C端接收到的“0000005”作为“Out Num”——我认为它可能与max/limit参数中的“5”相同—“5”在损坏的内存中显示为64位整数的几率非常小)。如果是这样的话,ctypes会在指针大小预期的8字节之外增加12-16个字节


您可能已经有了,但请在Python端仔细检查“skel”对象的定义——特别是,将其与正常工作的“fsm”对象进行比较——如果这并没有给您一个提示,请在问题的更新中粘贴您在这两个声明中发现的任何差异。

谢谢jsbueno,是的,关于“5”你是对的,我通过更改值来检查它。如果我能深入到骷髅物体,我会看得更深一点,看看是否能找到任何线索。我不想排除这是ctypes或python中的一个bug,如果不太困难,可能会尝试更新python安装(它包含在maya安装中)。