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

3
我正在使用C++代码中由matrix.h定义的mxAssert宏,Mex可以完美编译。当在我的被调用Mex代码中违反了某个断言时,这个断言不会导致我的程序崩溃,但会导致Matlab本身崩溃。我是否遗漏了什么?这是预期行为吗?
当我查看Matlab的崩溃报告时,造成崩溃的断言与我的代码中引发的断言相同,包括我的描述性描述... 我需要以某种方式运行我的Mex代码,以便Matlab可以识别Mex代码引起的断言(类似于try-catch)吗?
可能还有其他安全停止我的Mex代码并返回到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
这种情况不应该发生。断言失败应该将您带回到Matlab命令行。首先尝试一个简单的最小化Mex,如果仍然失败,请发布代码。 - nimrodm
1个回答

2

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

我想这是有道理的,因为这就是assert应该做的事情。

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

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__

为了打印行号等信息,需要进行以下操作。

如何将预处理器变量(如行号等)传递给 mexErrMsgTxt - JaBe
1
@JaBe,好问题。也许您可以发布一个关于此的新的C++问题。 - Oli
是的,请查看:http://stackoverflow.com/questions/28630530/how-to-print-c-preprocessor-variables-like-line-with-mexerrmsgtxt-in-matla - JaBe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接