2010-09-27 134 views
0

我想在python中包裝c通信庫,並且在嘗試處理大量數據時遇到一些麻煩。下面的代碼適用於較小的消息,但是當消息大於400MB時,我從PyObject_CallFunction調用中收到以下錯誤:PyObject_CallFunction訪問衝突寫入位置0x0000000c

python.exe中的0x1e00d65f未處理的異常:0xC0000005:訪問衝突寫入位置0x0000000c。

int request_callback(c_request* req, c_msg* msg, void* client) 
{ 
PyGILState_STATE gstate; 
PyObject* callback; 
PyObject* result; 
unsigned int request_addr; 
PyObject* py_request_addr; 
PyObject* message; 

gstate = PyGILState_Ensure(); 

request_addr = (unsigned int)req; 
py_request_addr = PyInt_FromLong(request_addr); 

if (PyDict_Contains(request_callback_dict, py_request_addr) == 1) 
{ 
    callback = PyDict_GetItem(request_callback_dict, py_request_addr); 
    message = PyString_FromStringAndSize(msg->data, msg->len); 

    result = PyObject_CallFunction(callback, "O", message); 
} 

PyGILState_Release(gstate); 

return 0; 
} 

有什麼想法可能會導致這種情況。謝謝。

+0

檢查你的返回值的錯誤條件,特別是。 PyString_FromStringAndSize。 – Ivo 2010-09-27 15:08:28

回答

0

進一步調試代碼後,它實際上是使用該字符串的python代碼的問題。該字符串是一個谷歌協議緩衝區,當從一個文件寫入數據並解析字節時,我可以捕獲庫引發的python異常。