我正在寻找一种方法来检测我的代码中调用特定函数的所有点。
一些例子:
sort
的直接调用,但找到sort
调用unique
并不容易例如{1}}。跟踪从特定函数到特定(内置)函数的所有潜在(in)直接函数调用的最佳方法是什么。
答案 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对功能体的回答。
这两种方法不适用于非自己代码的间接调用。对于间接调用,我只能想到一种基于内置类型创建自己的类的方法。例如,如果仅使用双精度类型,则需要创建自己的类,该类继承自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搜索的任何问题的信息以及列表中函数的位置被调用。额外的产出是......
在我看来你可以过滤你的功能的结果。
虽然需要警告你 - 通常需要花费很长时间来分析代码。