如何在调用fprintf或disp时抛出错误?

时间:2014-01-30 14:51:54

标签: matlab debugging error-handling

我有一个庞大的不可穿透代码库,可以写出非常烦人的换行符。由于一些奇怪的原因,我似乎无法找到它们的位置。所以我想在调用sprintfdisp时我是否可以让MATLAB抛出错误,我可以找到它们。有没有办法做到这一点?

我尝试了evalc,但它给出的只是输出本身而不是它被调用的位置。

4 个答案:

答案 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)

dbstop in

确定您可以重载dispfprintf,或者您可以告诉调试器使用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(即dbcleardbclear 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方法,因此查找正在生成变量的缺失分号更加困难。