Сохраните выходные сообщения об ошибках в файл в MATLAB

Есть ли способ сохранить сообщения об ошибках MATLAB в файл?

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

Спасибо!


person Doresoom    schedule 16.12.2009    source источник


Ответы (4)


Используйте команду «дневник», чтобы создать файл журнала. Это заставит Matlab записать в файл копию всего вывода командной строки, включая предупреждения, сообщения об ошибках и трассировку стека для необработанных исключений. Sendmail() может затем отправить его вам при ошибках. Если вы хотите сэкономить место, вы можете удалить файл журнала программы при обычном (без ошибок) выходе из программы.

ИМХО это предпочтительнее использования "попробовать... поймать; написать ошибки; закончить", потому что:

  • Он будет захватывать все неперехваченные ошибки, включая исключения Java, вызванные потоком AWT, и ошибки обратных вызовов M-кода в вашем графическом интерфейсе, которые может быть трудно обойти с помощью try/catch.
  • Если Matlab сильно падает, например, при segfault, попытка/поймать уровень M-кода не поймает его. Но файл дневника может по-прежнему записывать дамп segfault.
  • Вы можете выводить сообщения о ходе выполнения, отладочную информацию и предупреждения, чтобы предоставить больше информации о поведении вашей программы, ведущем к ошибкам, и все они будут зафиксированы.
  • Мне нравится, чтобы код в блоках catch был минимальным.

Также есть опция командной строки, которая делает то же самое; Я не знаю, как вызвать это для скомпилированного Matlab.

person Andrew Janke    schedule 17.12.2009
comment
Спасибо, я тоже попробую, если будет время. У меня уже работает адаптированная версия кода Джонаса. - person Doresoom; 18.12.2009
comment
Я лично предпочитаю использовать свой собственный файл журнала (все мои классы поставляются с методом, называемым «журнал»), потому что я не хочу загромождать окно команд всей моей отладочной информацией. Однако при хард-крашах и java-исключениях дневник, безусловно, очень полезен. - person Jonas; 19.12.2009

Используйте операторы try...catch вокруг кода. В блоке catch вы можете записать ошибку, включая информацию о стеке. Используя sendmail, вы даже можете настроить код, чтобы он уведомлял вас об ошибках по почте (в идеале с помощью всплывающего окна, которое позволяет пользователям решить, хотят ли они поделиться с вами информацией о сбоях).

try
   % your code here
catch err
   %open file
   fid = fopen('logFile','a+');
   % write the error to file
   % first line: message
   fprintf(fid,'%s\n',err.message);

   % following lines: stack
   for e=1:length(err.stack)
      fprintf(fid,'%sin %s at %i\n',txt,err.stack(e).name,err.stack(e).line);
   end

   % close file
   fclose(fid)
end 

Отредактировано, чтобы быть более точным в том, как записать сообщение об ошибке в файл

person Jonas    schedule 16.12.2009
comment
Вам не нужно самостоятельно форматировать сообщение и выполнять трассировку стека. За вас это сделает метод MException.getReport(): fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off')) - person Andrew Janke; 17.12.2009
comment
Для кого-то еще я нашел код sendmail() для Gmail здесь: mathworks.com/support/solutions/en/data/1-3PRRDV/index.html - person Doresoom; 18.12.2009
comment
Спасибо за предложение, Андрей и gnovice. - person Jonas; 19.12.2009

Для более старых версий MATLAB вы можете использовать LASTERROR. функция для получения информации о самой последней ошибке, выданной MATLAB. Однако эта функция будет постепенно упразднена в более новых версиях MATLAB.

Для более новых версий MATLAB я бы предложил использовать < strong>класс MException в записывать информацию об ошибках. Вы можете перехватить объект MException с помощью блока try-catch. как предложил Джонас, или вы могли бы потенциально использовать статический MException.last< /strong> метод для получения последнего необработанного исключения (в зависимости от того, как вы запускаете свой код):

%# OPTION 1:
%# --------
try
  my_code();
catch ME
  %# Save data in ME to file
end
%# OPTION 2:
%# --------
my_code();
ME = MException.last;
%# Save data in ME to file

Каким бы способом вы ни захватили объект MException, вы можете использовать MException.getReport для отображения отформатированной строки сообщения, включая информацию, содержащуюся в объекте MException:

msgString = getReport(ME,'basic');     %# Displays the higher level error
msgString = getReport(ME,'extended');  %# Displays the error and the stack

Затем вы можете записать строку сообщения в файл.

person gnovice    schedule 17.12.2009

Для точного стиля форматирования, например, из командного окна Matlab, используйте:

rep = getReport(exception, 'extended', 'hyperlinks', 'off');

name = strcat('Data\', name, '.txt');
fid = fopen(name, 'w+t','n');
fprintf(fid, 'Error message\n-------------\n\n');
fprintf(fid, '%s\n', rep);
fclose('all');
person Calleb    schedule 06.04.2013