происходит сбой mex файла, как использовать MATLAB_MEM_MGR в matlab? - PullRequest
5 голосов
/ 01 июня 2011

Я скомпилировал код C ++ в MEX-файл, но при вызове этого MEX-файла происходит сбой. В MATLAB выдается следующее сообщение об ошибке:

Обнаружено нарушение сегментации

Я попытался использовать try-catch в файле C ++, чтобы напечатать сообщение в блоке 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", но это не объясняет, как его использовать? Кто-нибудь может объяснить, пожалуйста?

Ответы [ 2 ]

4 голосов
/ 01 июня 2011

Во-первых, try / catch не поймает нарушение сегментации.Он перехватывает только исключения C ++, а не такие сигналы, как sigsegv.

Во-вторых, чтобы «использовать» MATLAB_MEM_MGR:

  1. Установите для переменной среды MATLAB_MEM_MGR значение «отладка» в оболочке ОС (например, в командной строке в Windows или в терминале).в Unix),
  2. Запустите MATLAB из той же оболочки,
  3. Запустите вашу MEX-функцию из этого MATLAB как обычно.

As Q3.5 в FAQ говорит, что если MEX-функция повреждает память, например, записывая после конца выделенного MATLAB блока памяти, MATLAB сообщит о повреждении при освобождении блока памяти.

Вместо этого вы можете попробовать запустить вашу MEX-функцию под отладчиком. Эта техническая заметка имеет несколько ссылок, описывающих, как это сделать на различных платформах.

EDIT : предыдущая ссылка не работает, вот последняя страница документа .

0 голосов
/ 24 июня 2015

Удалить mexEvalString("drawnow;"). Мне понадобилось 5 часов, чтобы понять это.

...