2016-05-07 258 views
0

我建立一个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)。没有其他有用的信息出现在这里,不是在发布模式。

+0

可以安全地认为这是Windows上的x86-64吗? – Dolda2000

+3

这可能很不方便,但您可能应该分解并使用调试版本。发布版本会生成所有调试符号的典型条形,并执行可能导致调试器显示一些意外结果的优化。 – Aenimated1

+0

是的,这是windows上的x64。 – jabozzo

回答

0

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

+0

'__cdecl'应该是x86目标的默认值。对于x64,'__cdecl'和'__stdcall'被忽略;编译器使用Windows x64调用约定,除非指定了__vectorcall。 – eryksun