2016-05-07 250 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