2012-11-07 325 views
2

我有ctypes奇怪的問題,因爲它似乎是通過取消引用應該不應該是指針損壞堆棧。與我保持一段時間,設置相當複雜。python ctypes堆棧損壞

我有一個C函數qfsm_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 

我然後輸出所有的參數的細節,並調用它在Python這樣的:

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) 

此輸出在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 
在CI

然後具備的功能是這樣的:

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設置爲NULL指針,那麼在輸入C函數並打印任何調試信息之前,我會得到NULL指針segfault。

有沒有人有可能會發生什麼的想法?我懷疑它可能是qskel_ptr類型的一些奇怪的問題,但這似乎不太可能,因爲我在傳遞NULL指針時解釋的行爲。

可能值得一提的是,我運行的是Windows 7 64位和Python 2.6.4。我也設法重現Python的行爲2.7.3

非常感謝

回答

0

對不起,不能夠幫助更多的 - 但一個好的暗示有「0000005」收到「出民」的C端 - 我認爲它可能與應該在最大值/限制參數中相同的「5」 - (在損壞的內存中出現爲64位整數的「5」的可能性非常小)。如果是這樣的話,ctypes會在指針大小的8倍以外增加12-16個字節。

您可能已經擁有了,但是請仔細檢查Python側的「skel」對象的定義 - 特別是將其與正在工作的正在工作的「fsm」對象進行比較 - 如果這樣做不會給您提示,請粘貼您在兩個聲明中找到的有關您問題更新的任何區別。

+0

謝謝jsbueno,是的你對「5」是正確的,我通過改變它的值來檢查它。如果我可以進入Skel對象,看看能否找到任何線索,會更深一層。我不想規定它是ctypes或python中的一個bug,並且可能會嘗試更新python安裝,如果它沒有證明太困難(它包含在maya安裝中)。 –