我有一个庞大的不可穿透代码库,可以写出非常烦人的换行符。由于一些奇怪的原因,我似乎无法找到它们的位置。所以我想在调用sprintf
或disp
时我是否可以让MATLAB抛出错误,我可以找到它们。有没有办法做到这一点?
我尝试了evalc
,但它给出的只是输出本身而不是它被调用的位置。
答案 0 :(得分:2)
我不建议抛出错误。例如,每当退出调试器时,workspace都会调用disp。设置断点可以更容易,如果您想要错误,请将keyboard
替换为错误。
function disp( varargin )
builtin('disp',varargin{:});
x=dbstack;
%it's nessecary to exclude all calls which come via workspacefunc,
%otherwise it's impossible to quit the debugger.
if numel(x)>2&&strcmpi(x(2).file,'workspacefunc.m')
return;
end
keyboard;
end
将此展示放在您的路径之上,它将调用内置,因此您可以看到打印的内容并在之后停止。对fprint
答案 1 :(得分:2)
确定您可以重载disp
或fprintf
,或者您可以告诉调试器使用dbstop
停止这些功能。然后使用dbstack
查看您的位置以及您是如何到达目的地的。没有MATLAB代码就可以内置这些内容。它将在通话前停止:
>> dbstop in disp Warning: MATLAB debugger can only stop in MATLAB code files, and "libmwbuiltins>disp" is not a MATLAB code file. Instead, the debugger will stop at the point right before "libmwbuiltins>disp" is called. >> dbstop in fprintf Warning: MATLAB debugger can only stop in MATLAB code files, and "libmwbuiltins>fprintf" is not a MATLAB code file. Instead, the debugger will stop at the point right before "libmwbuiltins>fprintf" is called.
看起来不错!
考虑以下具有嵌套函数testdbstop
的测试函数fprintTest
:
function testdbstop
x=1;
disp(x)
fprintTest(x)
function fprintTest(x)
fprintf('%d\n',x);
end
end
从命令行运行它:
>> testdbstop
3 disp(x)
K>> dbstack
> In testdbstop at 3
K>> dbcont
1
6 fprintf('%d\n',x);
K>> dbstack
> In testdbstop>fprintTest at 6
In testdbstop at 4
K>> dbcont
1
你有它 - 在testdbstop.m
的第3行调用disp,在fprintf
的{{1}}的第6行调用testdbstop.m
testdbstop>fprintTest
。
注意:完成后,请使用testdbstop
(即dbclear
和dbclear in disp
)删除虚拟断点。
答案 2 :(得分:1)
你可以做的是编写自己的disp()函数(可能会产生error()函数的错误),将其保存为当前Matlab路径中的disp.m。这将覆盖内置的disp()&让你找到它的所在位置。
或者,您可以使用Notepad ++打开库中的所有文件,并在所有打开的文件中搜索术语“disp(”
答案 3 :(得分:0)
使fprintf
抛出错误很容易,因为fprintf
没有重载方法。
您可以通过在当前目录中创建一个名为fprintf.m的新函数(在Matlab路径中始终最高)来遮蔽内置fprintf
。该函数应包含如下代码:
function fprintf(varargin)
error('Error message to help find fprintf statements')
现在,当您运行不可穿透的代码时,只要调用fprintf
,您就会收到错误。
如果不可穿透的代码更改了目录,则可能无法调用新的fprintf.m。在这种情况下,我会将您的自定义fprintf.m代码放在matlab路径上比Matlabs fprintf
函数更高的文件夹中。您可以通过在命令行中输入以下命令来检查它是否更高:
which fprintf -all
Matlab的内置函数应该被遮蔽,你的内置函数应该在顶部。看起来应该是这样的:
哪个fprintf -all C:\用户\ MYNAME \文档\ MATLAB \ fprintf.m C:\ Program Files(x86)\ MATLAB \ R2009a \ toolbox \ matlab \ iofun \ @serial \ fprintf.m%serial method 内置(C:\ Program Files(x86)\ MATLAB \ R2009a \ toolbox \ matlab \ iofun \ fprintf)%Shadowed
由于存在许多不同的disp方法,因此查找正在生成变量的缺失分号更加困难。