2009-12-16 78 views
12

有没有办法将MATLAB错误信息保存到文件中?将输出错误信息保存到MATLAB文件中

这可能是一个简单的问题,但谷歌无法给我一个答案。我编译了一个没有MATLAB许可证的GUI可执行文件,偶尔它会冻结。出于美学目的,我压制了通常伴随此类可执行文件的命令窗口,因此我无法通过命令提示符获取错误消息。我希望能够创建一个错误日志,可以通过电子邮件发送给我进行调试。

谢谢!

回答

11

使用“diary”命令创建日志文件。这将使Matlab将所有命令行输出的副本写入文件,包括警告,错误消息和未处理异常的堆栈跟踪。然后,Sendmail()可以将错误发送给您。如果您想节省空间,您可以让程序在正常(无错误)程序退出时删除其日志文件。

恕我直言,这是最好使用“的try ... catch;写入错误,结束”,因为:

  • 它将捕获所有未被捕获的错误,包括来自AWT线程提出的Java异常和错误的M在你的图形用户界面的代码回调,这可能很难得到周围的尝试/捕获。
  • 如果Matlab崩溃很严重,就像使用段错误一样,M代码级try/catch将无法捕捉它。但日记文件可能仍会记录段故障转储。
  • 您可以发出进度消息,调试信息和警告,以提供有关导致错误的程序行为的更多信息,并且全部都会被捕获。
  • 我喜欢尽量减少catch块的代码。

还有一个命令行选项可以实现等效功能;我不知道如何为编译的Matlab调用它。

+0

谢谢,如果我有时间的话,我也会试一试。我已经有了一个乔纳斯的代码工作的改编版本。 – Doresoom 2009-12-17 21:41:21

+0

我个人更喜欢使用我自己的日志文件(我的类都带有一个名为'log'的方法),因为我不想把命令窗口与我所有的调试信息混淆在一起。但是,对于严重崩溃和Java异常,日记当然非常有用。 – Jonas 2009-12-19 17:44:29

11

围绕代码使用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 

编辑成更明确一点如何将错误信息写入文件

+6

你不需要格式化消息和堆栈跟踪自己。 MException.getReport()方法会为你做:fprintf(fid,'%s',err.getReport('extended','hyperlinks','off')) – 2009-12-17 19:57:17

+0

对于其他人的引用,我发现sendmail )代码为: http://www.mathworks.com/support/solutions/en/data/1-3PRRDV/index.html – Doresoom 2009-12-17 21:38:37

+0

感谢您的建议,安德鲁和gnovice。 – Jonas 2009-12-19 17:35:42

3

对于旧版本的MATLAB,您可以使用LASTERROR函数来获取有关MATLAB发布的最新错误的信息。但是,这个函数将在更新的MATLAB版本中被淘汰。

对于较新版本的MATLAB,我建议使用MException classcapture error information。您可以使用try-catch block作为Jonas suggested赶上一个MException对象,或者你可能使用静态MException.last method得到最后的未捕获异常(取决于你如何运行代码):

%# 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 method显示格式化的消息字符串包括包含在MException对象的信息:

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

然后,您可以编写消息字符串的文件。

1

对于准确的格式风格就像从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'); 
2
try 
    % your code here 
catch err 
    fid = fopen('errorFile','a+'); 
    fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off')) 
    fclose(fid) 
end