查找对特定内置MATLAB函数的间接调用

时间:2014-01-06 16:59:25

标签: matlab debugging built-in function-call

我想要什么?

我正在寻找一种方法来检测我的代码中调用特定函数的所有点。

我为什么要这样做?

一些例子:

  • 有些输出是排序的或随机的,我想知道这种情况发生在哪里
  • 我正在考虑更改/重载一个函数,并想知道我的代码的哪一部分会产生影响

我尝试了什么?

  • 我在被调用的文件中尝试放置断点。这仅适用于非内置函数,这些函数是从始终执行所有内容的短运行代码调用的。
  • 我尝试了'查找文件',这样我就可以轻松找到对sort的直接调用,但找到sort调用unique并不容易例如{1}}。
  • 我试过 depfun ,它告诉我:
    • 是否会调用某些内容
    • 将从中调用非内置函数
  • 我想到重载内置功能,但感觉就像是我的最后手段,因为我害怕弄得一团糟。 |编辑:由于功能优先,它可能也无济于事。

问题

跟踪从特定函数到特定(内置)函数的所有潜在(in)直接函数调用的最佳方法是什么。

3 个答案:

答案 0 :(得分:3)

我并不完全了解您的用例,但我想您可以使用dbstack获取所需的大部分信息,它会为您调用所有调用某个函数的父函数的调用堆栈。我认为最简单的方法是重载这样的内置函数(我试图重载min):

function varargout = min(varargin)

% print info before function call
disp('Wrapped function called with inputs:')
disp(varargin)
[stack,I] = dbstack();
disp('Call stack:')
for i=1:length(stack)
    fprintf('level %i: called from line %i in file %s\n', ...
        i, stack(i).line, stack(i).file);
end

% call original function
[varargout{1:nargout}] = builtin('min', varargin{:});

% print info after function call
disp('Result of wrapped function:')
disp(varargout)

我试图对此进行测试,但遗憾的是我无法使其工作,即使在使用addpath进行大量游戏之后,matlab也继续使用原始函数。不知道我在那里做错了什么,但我希望这能让你开始......

答案 1 :(得分:3)

内置函数优先于本地文件夹或路径中的函数。有两种方法可以使用自己的代码直接调用内置过载。将您的函数放在其他MATLAB函数所在的同一目录下的私有文件夹中。如果您尚未使用私人文件夹,这将更容易。完成调查后,您可以重命名私人文件夹。

另一种方法是使用包并导入它们。您将所有覆盖功能放在一个文件夹中(例如+ do_not_use)。然后在您怀疑内置调用的函数中添加“import do_not_use。*;”行。这将首先调用+ do_not_use目录中的函数。检查完成后,可以使用“清除导入”清除所有导入。如果你有太多的功能,并且不知道你需要添加导入功能,这就不容易使用。

除此之外,对于每个功能,您需要遵循Bas Swinckels对功能体的回答。

Function precedence order

这两种方法不适用于非自己代码的间接调用。对于间接调用,我只能想到一种基于内置类型创建自己的类的方法。例如,如果仅使用双精度类型,则需要创建自己的类,该类继承自double并覆盖要检测的方法。然后将此类作为输入传递给您的代码。您的代码应该可以正常工作(假设您没有使用类(x)来决定代码路径),因为新类应该像双数据类型一样。如果未根据输入数据创建输出数据,则此选项将不起作用。请参阅subclassing built-in types

答案 2 :(得分:0)

你试过depfun吗?

该文档显示的结果与您请求的结果类似。

doc depfun

  

...

     

[list,builtins,classes,prob_files,prob_sym,eval_strings,called_from,java_classes] = depfun('fun')创建其他单元格数组或结构数组,其中包含有关depfun搜索的任何问题的信息以及列表中函数的位置被调用。额外的产出是......

在我看来你可以过滤你的功能的结果。

虽然需要警告你 - 通常需要花费很长时间来分析代码。