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 在退出后崩溃
使用 fopen 文件时,matlab 在没有转储文件的情况下崩溃