【问题标题】:Call stack corruption between boundaries边界之间的调用堆栈损坏
【发布时间】:2010-12-04 10:21:35
【问题描述】:

这感觉很像在干草堆里找一根针,但是就这样吧。

我正在构建一个 Windows Mobile 6.1 应用程序。具体来说,我正在尝试移植OpenCV framework。在成功(怀疑)为 ARM4I 架构编译 OpenCV 之后,我正在一个简单的 hello world 风格的应用程序中尝试它。

从我的 WinCE .EXE 调用存储在 OpenCV .DLL (cxcore200.dll) 中的函数。简单的调用如下所示。

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

当我踏入 cvCreateImage 时会出现重大问题。方法签名是:

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

所以当我进入这个函数时,深度和大小参数分别等于 320 和 240(不是预期的 8 和 1)。

作为参考,CvSize 声明为:

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

这显然是某种调用堆栈损坏,这与我跨越边界进入可能错误编译的 DLL 的事实有关。

DLL 和 EXE 编译和链接都没有错误。 有没有人见过这样的事情?关于如何调试的任何想法?

【问题讨论】:

  • 用几个不同的标志重新编译似乎已经解决了这个问题。

标签: c++ stack opencv call windows-ce


【解决方案1】:

当我不得不调试这个(15 年前,Win16)时,我使用了反汇编。读起来并不简单,但它清楚地表明了正在发生的事情。

【讨论】:

    【解决方案2】:

    我不熟悉您的具体环境,但我建议您在致电 cvCreateImage 时仔细检查以确保您使用的是正确的调用约定。参考资料见this

    例如,VC++ 中的默认 C++ 调用约定是“thiscall”,但 cvCreateImage 可能需要 __stdcall__cdecl__fastcall

    【讨论】:

    • 好主意,但我做了一些研究,显然 ARM 架构忽略了所有调用约定并使用了一些默认约定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2016-03-11
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多