2009-10-06 145 views
0

這種感覺很像在乾草堆中找到一根針,但這裏就是這樣。邊界之間的調用堆棧損壞

我正在構建Windows Mobile 6.1應用程序。具體而言,我試圖移植OpenCV framework。成功(懷疑)爲ARM4I架構編譯OpenCV後,我在一個簡單的hello世界風格的應用程序中嘗試了它。

從我的WinCE .EXE我調用存儲在OpenCV .DLL(cxcore200.dll)中的函數。簡單的調用看起來像這樣。

IplImage *src = cvCreateImage(cvSize(320,240), 8, 1); 

當我步入cvCreateImage時會出現主要問題。該方法的簽名是:

IplImage * cvCreateImage(CvSize size, int depth, int channels){ ... } 

所以,當我踏進這個功能,深度和尺寸PARAMS分別等於320和240(未圖8和1如預期)。

僅供參考,CvSize聲明爲:

typedef struct 
{ 
    int width; 
    int height; 
} 
CvSize; 

這顯然是某種具有的事實,我越過邊界進入可能不正確地編譯DLL做調用堆棧腐敗。

DLL和EXE都可以編譯鏈接而不會出錯。 有沒有人見過類似的東西?有關如何調試的任何想法?

+0

重新編譯幾個不同的標誌似乎已經解決了這個問題。 – alyx 2009-10-09 01:18:19

回答

0

我對您的具體環境並不熟悉,但我建議仔細檢查一下,以確保您在撥打電話cvCreateImage時使用了正確的通話約定。有關參考資料,請參閱this

例如,默認的C++調用VC++約定 「thiscall」,但或許cvCreateImage預計__stdcall__cdecl,或__fastcall

+0

好主意,但我做了一些研究,顯然ARM架構忽略了所有的調用約定並使用了一些默認的調用約定。 – alyx 2009-10-06 22:28:12

0

當我不得不調試這個(15年前,Win16)時,我使用了反彙編。不平凡的閱讀,但它確切地發生了什麼。