Matlab:如何调试脚本(显示错误的行号)

时间:2016-07-19 08:36:00

标签: matlab debugging

如果在完全运行脚本时发生错误,则错误将显示发生错误的行号。但是,我在脚本编写过程中使用了“运行部分”(在Windows上进行控制 - 输入)很多。函数,然后出现没有行号的任何错误。

这会让我感到烦恼(双关语),因为这种行为确实没有充分的理由。这个问题之前提出here,但我发现答案非常不令人满意:'就是这样,就像使用命令行一样'。 我不同意,因为:a)我使用'run section'运行的代码块由行组成,块本身在脚本中有一定的行位置。应该可以知道这些行在脚本中的位置,从而也知道错误发生的位置; b)如果'run section'确实与在命令行中运行代码完全一样,那么执行的代码块仍然由行组成。然后至少可以知道块内的行号..对吗?

问题:使用“运行部分”运行部分脚本时,是否可以在错误消息中显示行号?如果没有,为什么技术上不可能?

MWE:

   % this is my script

   %% this is a section with an error
   a(:) = zeros(1,2,3);

保存并运行(F5)给出行号(5)的错误,“运行”部分没有。

使用版本R2013a,R2016a中的行为相同

1 个答案:

答案 0 :(得分:0)

根据Dev-il的有用评论(并且忽略了他对我的代码排序更好的建议)我制作了一个基本完成所要求的脚本:它运行当前部分(基于光标的位置)在编辑器中)通过制作该部分的副本并将其作为新脚本运行。这样做是为了保留行号,这样任何错误都可以与原始段中的行相关。

代码:

%% Copies currently selected section in editor to new file and runs it filehandle = matlab.desktop.editor.getActive; code = filehandle.Text; pos = filehandle.Selection(1); % convert to line by line cell codeLines = strread(code,'%s','delimiter','\n','whitespace',''); NL = numel(codeLines); % number of lines % find begin and end of current section % begin startSectionPos = []; for ilr = 1:pos il = pos + 1 -ilr; % starting at pos and going up if isempty(startSectionPos) % not found yet % test if section start if ~isempty(regexpi(codeLines{il},'^(\s)*%%','start')) % this line contains %% at beginning of the line startSectionPos = il; end else % we found it already codeLines{il} = ''; % delete lines end end % end. we start at pos+1 if pos is start of section endSectionPos = []; for il = (pos+(pos==startSectionPos)):NL % going down if isempty(endSectionPos) % not found yet % test if next section start if ~isempty(regexpi(codeLines{il},'^(\s)*%%','start')) % this line contains %% at beginning of the line endSectionPos = il-1; %previous section ended previous line codeLines{il} = ''; % delete line end else % we found it already codeLines{il} = ''; % delete lines end end %% %newCode = char(codeLines); % save m file containing only selected section filename = 'section.m'; fid = fopen(filename, 'wt'); fprintf(fid, '%s\n',codeLines{:}); fclose(fid); % test if there are too many 'end's left at the end of the file complaints = mlint(filename); Nc = numel(complaints); linesErr = []; for icr = 1:Nc ic = Nc + 1 - icr; % start at bottom, go up if strcmpi(complaints(ic).message,'Parse error at END: usage might be invalid MATLAB syntax.') linesErr = [linesErr; complaints(ic).line]; end end % fix loose ends for il = 1:numel(linesErr) codeLines{linesErr(il)} = ''; % delete lines end % write again filename = 'section.m'; fid = fopen(filename, 'wt'); fprintf(fid, '%s\n',codeLines{:}); fclose(fid); %% run new file, give nice report if error try run(filename) catch err err.getReport end

使用方法: 将代码保存为路径中的runSection.m。在编辑工作。如果要运行某个部分,请将光标放在该部分中,然后键入' runSection'在命令窗口中或通过键盘绑定(快捷方式)启动runSection.m,可以使用内置的short cuts placed on Quick Access进行设置。现在你可以在control-enter上使用alt-1来运行你的部分!设置绑定的另一种方法是EditorMacro,目前已过时。