2011-06-01 103 views
4

我编译了一个C++代码到MEX文件,但是在调用这个MEX文件时,它崩溃了。 它使MATLAB中的以下错误消息:mex文件崩溃了,如何在matlab中使用MATLAB_MEM_MGR?

段违规检测

我尝试使用try-catch代码在C++中的文件打印在catch块 像消息,

try { 
    //my code; 
} 
catch(std::exception &e) 
{ 
    mexPrintf(e.what()); 
    mexEvalString("drawnow;"); 
    return; 
} 

但打印消息不起作用,代码仍然崩溃。

地看着谷歌,大部分时间它指向某种形式的消息MathWorks公司给出的:http://www.mathworks.de/matlabcentral/newsreader/view_thread/25900

它指示设置可变环境"MATLAB_MEM_MGR=debug", 但它没有解释如何使用它?任何人都可以请解释吗?

回答

4

首先,try/catch不会触发分段冲突。它只捕获C++异常,而不是像sigsegv这样的信号。

其次,以 “用” MATLAB_MEM_MGR

  1. 设置环境变量MATLAB_MEM_MGR为 “调试” 在OS壳(如在Windows命令提示符或UNIX上的终端),
  2. 运行MATLAB从相同的外壳,
  3. 通常从该MATLAB运行您的MEX函数。

由于常见问题的Q3.5说,如果MEX-功能由(例如)书写破坏记忆一个怀旧的MATLAB分配块的结尾,MATLAB将报告腐败行为时的内存块被释放。

您可能不想尝试在调试器下运行MEX函数。 This tech note有几个链接描述如何在各种平台上这样做。

编辑:以前的链接已经死了,这里是最新的doc page

+0

嗨,我可以解决这个问题。由于错误的输入格式,我得到了崩溃,错误的格式导致零分。 – 2011-06-04 00:56:59

+0

发布此消息之前,我曾尝试用cpp调试代码,但是我无法捕捉它。正如我所提到的,我尝试过使用try catch,printing等等。而且,我从来没有想过这次崩溃可能是由于零分,因此我所有的努力都是要看看我是否试图访问额外的内存。无论如何,谢谢。 – 2011-06-04 01:00:17

0

删除mexEvalString("drawnow;")。我花了5个小时才弄清楚这一点。