PyObject_CallFunction 访问冲突,写入位置 0x0000000c

0 投票
1 回答
868 浏览
提问于 2025-04-16 04:39

我正在尝试把一个C语言的通信库封装到Python中,但在处理大量数据时遇到了一些麻烦。下面的代码在处理较小的消息时可以正常工作,但当消息超过400MB时,我在调用PyObject_CallFunction时遇到了以下错误:

在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;
}

有没有人能帮我分析一下可能是什么原因呢?谢谢。

1 个回答

0

经过进一步调试代码,我发现其实是使用字符串的Python代码出了问题。这个字符串是谷歌的一种协议缓冲区格式,当从文件中写入数据并解析这些字节时,我会捕捉到库抛出的一个Python异常。

撰写回答