2009-10-06 140 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)时,我使用了反汇编。不平凡的阅读,但它确切地发生了什么。