指针函数参数损坏,堆栈损坏?

2024-06-16 11:22:21 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我构建了一个C++库,它通过Python通过cType调用。函数的参数是指向结构的指针,并将其传递给其他(内部)函数。看起来像这样:

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,inside subscribe_internal的值是: endpoint=0x000007fef15f7740(回调=0x0000000000000000)。在

我没有生成其他线程,我正在以发布模式编译库**。我唯一的嫌疑可能是堆栈腐败,但实际上我知道发生了什么。在

任何可能发生的事情的暗示都是非常受欢迎的。在

**我在调试模式下编译过python,但是使用spider设置速度很慢,如果使用调试编译版本,我会丢失交互式控制台,因此我更喜欢使用发行版python,并在release中编译我的库。在

编辑:

正如建议的那样,我将python的调试版本与库的调试编译一起使用。但我还是得到了相同的行为(端点:0x0000000002be80e0->;0x0000000000000000,回调:0x0000000000320f88->;0x00000000024d24b8)。没有其他有用的信息出现在这里,不是在发布模式。在


Tags: 函数reportlinecallbackexceptioncodesubscribe端点
1条回答
网友
1楼 · 发布于 2024-06-16 11:22:21

我使用CDLL(“path”)加载库,这使得调用约定成为cdecl。即使我用/Gd在VS2008中编译,它似乎在使用其他约定。在函数声明中添加\uu cdecl可以解决这个问题。在

相关问题 更多 >