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

Pointer function argument corrupted, Stack corruption?

本文关键字:已损坏 堆栈 参数 函数 指针      更新时间:2023-10-16

Im正在构建一个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_interal内部,值为:端点=0x000007fef15f7740(回调=0x0000000000000000)。

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

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

**我在调试模式下编译了python,但使用spider设置很慢,如果我使用调试编译版本,我会失去交互式控制台,所以我更喜欢使用发布版python并在发布版中编译我的库。

编辑:

按照建议,我使用了python的调试版本和库的调试编译。但我仍然得到了相同的行为(端点:0x0000000002be80e0->0x0000000000000000,回调:0x0000000000320f88->0x00000000024d24b8)。这里没有其他非发布模式的有用信息。

我使用CDLL("path")加载库,这使得调用约定cdecl。即使我使用/Gd在VS2008中编译,它似乎也在使用其他约定。将__cdecl附加到函数声明中可以解决此问题。