MEX文件中的断言导致Matlab崩溃

时间:2011-12-13 16:39:05

标签: c++ matlab-engine

我在我的C ++代码中使用{strong> matrix.h 定义的mxAssert - 宏,mex完美编译。当我的被调用的mex代码中违反了断言时,这个断言不会导致我的程序崩溃而是Matlab本身。我错过了什么吗?这是预期的行为吗? 当我查看Matlab的崩溃报告时,导致的断言与我的代码提出的相同 - 包括我的描述性描述......我是否必须以某种方式运行我的mex代码,以便Matlab可以识别mex代码导致的断言(类似尝试捕获)? 可能还有另一种方法可以安全地停止我的mex代码并返回到Matlab提示符。

提前感谢您,非常感谢任何帮助!

编辑:使用命令mex -v Temp.cpp -g

编译代码

编辑:一个让我的matlab屈服的最小例子:

#include <matrix.h>
class Temp {
public:
    Temp();
    virtual ~Temp();
};

Temp::Temp() {
    // TODO Auto-generated constructor stub
}

Temp::~Temp() {
    // TODO Auto-generated destructor stub
}

extern "C" {
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    int foo = 10;
    mxAssert(foo==11, "foo is not 10");
}
}

1 个答案:

答案 0 :(得分:2)

在我的系统(Ubuntu 64)上,它也崩溃了。

我想这会让你感觉到,因为这就是断言应该做的事情。

我强烈建议你使用类似的东西:

if(error){mexErrMsgTxt("assert failed\n");}

否则,我的一个朋友有以下技巧(使用预处理器指令):

#define assert( isOK )       ( (isOK) ? (void)0 : (void) mexErrMsgTxt("assert failed\n") )

打印单个错误字符串,例如myassert(A=B,"A not B"),你可以稍微强化一下:

#define myassert( isOK,astr )      ( (isOK) ? (void)0 : (void) mexErrMsgTxt(astr) ) 

他还告诉我你可以使用以下内容来改进它:

#isOK,__LINE__,__PRETTY_FUNCTION__, __FILE__

...以打印行号等。