5

我已将 C++ 代码编译为 MEX 文件,但在调用此 MEX 文件时,它会崩溃。它在 MATLAB 中给出以下错误消息:

检测到分段违规

我尝试在 C++ 文件中使用 try-catch 在 catch 块中打印消息,例如,

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

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

在查看 Google 时,大多数时候它指向 MathWorks 给出的某种形式的消息:http: //www.mathworks.de/matlabcentral/newsreader/view_thread/25900

其中指示设置环境变量"MATLAB_MEM_MGR=debug",但没有说明如何使用它?谁能解释一下?

4

2 回答 2

4

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

其次,“使用” MATLAB_MEM_MGR

  1. MATLAB_MEM_MGR在 OS shell(如 Windows 上的命令提示符或 Unix 上的终端)中将环境变量设置为“调试”,
  2. 从同一个 shell 运行 MATLAB,
  3. 从该 MATLAB 正常运行您的 MEX 函数。

正如FAQ 的Q3.5所说,如果 MEX 函数通过(例如)写入超过 MATLAB 分配的内存块的末尾而损坏内存,则 MATLAB 将在释放内存块时报告损坏。

您可能想尝试在调试器下运行 MEX 函数。本技术说明有几个链接,描述了如何在各种平台上执行此操作。

编辑:先前的链接已失效,这是最新的文档页面

于 2011-06-01T18:01:16.513 回答
0

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

于 2015-06-23T22:03:44.883 回答