mex 文件崩溃,如何在 matlab 中使用 MATLAB_MEM_MGR?

Posted

技术标签:

【中文标题】mex 文件崩溃,如何在 matlab 中使用 MATLAB_MEM_MGR?【英文标题】:mex file is crashing, how to use MATLAB_MEM_MGR in matlab? 【发布时间】:2011-09-05 22:05:56 【问题描述】:

我已将 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", 但它没有解释如何使用它?谁能解释一下?

【问题讨论】:

【参考方案1】:

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

第二,“使用”MATLAB_MEM_MGR

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

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

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

编辑:之前的链接失效了,这里是最新的doc page。

【讨论】:

嗨,我可以解决这个问题。由于输入格式错误,我崩溃了,错误的格式导致除以零。 在发布此消息之前,我曾尝试使用 cpp 调试代码,但无法捕捉到它。正如我所提到的,我尝试使用 try catch、打印等。没有任何帮助。此外,我从没想过崩溃可能是由于除以零,所以我所有的努力都是看看我是否试图访问额外的内存。无论如何,谢谢。【参考方案2】:

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

【讨论】:

以上是关于mex 文件崩溃,如何在 matlab 中使用 MATLAB_MEM_MGR?的主要内容,如果未能解决你的问题,请参考以下文章

多线程 (pthreads) MATLAB mex 函数导致 MATLAB 在退出后崩溃

Matlab 在 MEX 函数中崩溃

使用 fopen 文件时,matlab 在没有转储文件的情况下崩溃

如何在 fortran mex 文件中使用 mxCalloc

MATLAB mex文件

使用 mex 将一个大矩阵从 Matlab 传递到 C:Matlab 崩溃