我建立一個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