我建立一个C++库,它被python通过ctypes调用。该函数具有一个指向结构的指针并将其传递给其他(内部)函数。它看起来像这样:指针函数参数损坏,堆栈损坏?
extern "C" __declspec(dllexport) void USBEndpoint_subscribe(USBEndpoint* endpoint, CALLBACK callback) {
try {
subscribe_internal(endpoint, callback);
} catch (int e_code) {
exception_report(__FILE__, __LINE__, e_code); \
} catch (...) {
exception_report(__FILE__, __LINE__);
}
void subscribe_internal(USBEndpoint* endpoint, CALLBACK callback)
{
...
}
的事情是,端点值收到在USBEndpoint_subscribe不进入subscribe_internal相同的值。例如:
在调试时,我可以看到USBEndpoint_subscribe临危: 端点= 0x00000000088f0680(和回调= 0x0000000000540f50)
并尽快我踏入subscribe_internal,subscribe_internal值内是: 端点= 0x000007fef15f7740(和callback = 0x0000000000000000)。
我还没有产生其他线程,我正在编译库在发布模式**。我唯一的嫌疑人可能是堆栈腐败,但实际上我知道发生了什么。
任何可能发生的提示都非常受欢迎。
**我在调试模式下编译了python,但使用spider设置很慢,如果我使用我的调试编译版本,我放松了交互式控制台,所以我更愿意使用release python并在发布时编译我的库。
编辑:
至于建议,我用蟒蛇我调试版本与库的调试编译。但我仍然有相同的行为(端点:0x0000000002be80e0-> 0x0000000000000000,回调:0x0000000000320f88-> 0x00000000024d24b8)。没有其他有用的信息出现在这里,不是在发布模式。
可以安全地认为这是Windows上的x86-64吗? – Dolda2000
这可能很不方便,但您可能应该分解并使用调试版本。发布版本会生成所有调试符号的典型条形,并执行可能导致调试器显示一些意外结果的优化。 – Aenimated1
是的,这是windows上的x64。 – jabozzo