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

Assertion in MEX file causes Matlab to crash

本文关键字:Matlab 崩溃 断言 MEX 文件      更新时间:2023-10-16

我在我的c++代码中使用由matrix.h定义的mxAssert -宏,它可以完美编译。当我调用的mex代码中违反了一个断言时,这个断言导致的不是我的程序崩溃,而是Matlab本身崩溃。我错过什么了吗?这是有意的行为吗?当我查看Matlab的崩溃报告时,导致断言与我的代码提出的断言完全相同-包括我的描述性描述……我是否必须以某种方式运行我的mex代码,以便Matlab能够识别由mex代码引起的断言(类似于try-catch)?可能还有另一种方法可以安全地停止我的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");
}
}

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

我想这是有意义的,因为这就是assert应该做的。

我强烈建议你使用如下格式:

if(error){mexErrMsgTxt("assert failedn");}

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

#define assert( isOK )       ( (isOK) ? (void)0 : (void) mexErrMsgTxt("assert failedn") )

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

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

他还告诉我,你可以用这样的方法来改进它:

#isOK,__LINE__,__PRETTY_FUNCTION__, __FILE__

…为了打印行号等等