From c37c0656a760597624413f0ec797fce606d7ed85 Mon Sep 17 00:00:00 2001 From: wangjiyu Date: Thu, 10 Apr 2025 13:00:35 +0800 Subject: [PATCH] debug --- util/RTCContext.cpp | 80 +++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/util/RTCContext.cpp b/util/RTCContext.cpp index 02e65ac..c681ce3 100644 --- a/util/RTCContext.cpp +++ b/util/RTCContext.cpp @@ -64,6 +64,10 @@ void RTCContext::onAudioProcess(const char* roomId, const char* peerId, namespace py = boost::python; // 1. 获取 GIL(绝对必要) + if (!Py_IsInitialized()) { + std::cerr << "Python interpreter not initialized" << std::endl; + return; + } PyGILState_STATE gstate = PyGILState_Ensure(); try { @@ -71,54 +75,66 @@ void RTCContext::onAudioProcess(const char* roomId, const char* peerId, std::cout << "dataCount:" << audioFrame.dataCount << std::endl; std::cout << "dataCount value: " << audioFrame.dataCount << " (max: " << std::numeric_limits::max() << ")" << std::endl; - // 在调用 PyArray_SimpleNew 前插入 + + if (!PyArray_API) { - std::cerr << "FATAL: NumPy API not initialized! Addr: " << PyArray_API << std::endl; - abort(); // 立即终止以暴露问题 + PyGILState_Release(gstate); + throw std::runtime_error("NumPy C-API not initialized. Call import_array() in module init"); } - std::cout << "step0" << std::endl; - if (!PyArray_SimpleNew) { - std::cerr << "FATAL: PyArray_SimpleNew symbol missing!" << std::endl; - abort(); - } - std::cout << "step0.1" << std::endl; + // 3. 严格校验输入数据 if (!audioFrame.data || audioFrame.dataCount <= 0) { - std::cerr << "Invalid audio frame data" << std::endl; PyGILState_Release(gstate); - return; + throw std::invalid_argument("Invalid audio frame data"); + } + + // 4. 安全创建维度数组(带边界检查) + if (audioFrame.dataCount > std::numeric_limits::max()) { + PyGILState_Release(gstate); + throw std::overflow_error("Audio frame size exceeds maximum limit"); } - std::cout << "step1" << std::endl; npy_intp dims[1] = {static_cast(audioFrame.dataCount)}; - std::cout << "step2" << std::endl; - PyObject* pyArray = PyArray_SimpleNew(1, dims, NPY_INT16); - std::cout << "step3" << std::endl; - if (!pyArray) { - PyGILState_Release(gstate); - throw std::runtime_error("Failed to create NumPy array"); + // 5. 创建NumPy数组(带内存保护) + PyObject* pyArray = nullptr; + { + py::gil_scoped_acquire gil; // 确保在创建数组时持有GIL + pyArray = PyArray_SimpleNew(1, dims, NPY_INT16); + if (!pyArray) { + PyGILState_Release(gstate); + throw std::bad_alloc(); + } } - std::cout << "step4" << std::endl; - std::memcpy(PyArray_DATA((PyArrayObject*)pyArray), + + // 6. 安全拷贝数据(带对齐检查) + if (reinterpret_cast(audioFrame.data) % alignof(int16_t) != 0) { + Py_DECREF(pyArray); + PyGILState_Release(gstate); + throw std::runtime_error("Unaligned audio data pointer"); + } + std::memcpy(PyArray_DATA(reinterpret_cast(pyArray)), audioFrame.data, audioFrame.dataCount * sizeof(int16_t)); - std::cout << "step5" << std::endl; - // 6. 执行回调 + // 7. 执行回调(带引用计数保护) if (!py_callback_.is_none()) { - py_callback_( - py::handle<>(pyArray), // 自动管理引用 - audioFrame.dataCount, - audioFrame.sampleRate, - audioFrame.numChannels, - audioFrame.channelIndex - ); + try { + py_callback_( + py::handle<>(pyArray), // 自动管理引用 + audioFrame.dataCount, + audioFrame.sampleRate, + audioFrame.numChannels, + audioFrame.channelIndex + ); + } catch (...) { + Py_DECREF(pyArray); + throw; // 重新抛出异常 + } } - std::cout << "step6" << std::endl; - // 7. 释放数组(py::handle 会管理引用,此处可省略) + // 8. 释放资源 Py_DECREF(pyArray); - std::cout << "step7" << std::endl; + PyGILState_Release(gstate); } catch (const std::exception& e) { std::cerr << "Audio process error: " << e.what() << std::endl;