4

在 matlab 中,可以使用 dbstack 在当前时间检索调用堆栈,但是 dbstack 在独立编译的 matlab 程序版本中不可用,是否有另一种方法来获取调用堆栈,或者至少是调用当前函数的函数?我想编写一个需要知道它被谁调用的设施函数,但最好使用完整的调用堆栈。

4

1 回答 1

11

到目前为止,解决方案如下:

  • 正如您所提到的,函数DBS​​TACKMATLAB Compiler 不支持的函数列表中,因此无法使用。
  • 您还在评论中提到,即使函数EVALIN不在不受支持的函数列表中,您的编译器仍然不允许您使用它。这最终拒绝了我之前建议的一些解决方案。
  • 必须通过沿函数调用链传递参数(或者可能通过将它们存储在全局变量中)来维护自己的堆栈跟踪不是一个理想的选择,因为维护起来很复杂并且需要额外的工作。

但是,我还有另一种可能的解决方案,我认为它是“最干净”的解决方案:使用错误处理机制来获取堆栈跟踪。这将根据您使用的 MATLAB 版本而有所不同...

MATLAB 7.5 (R2007b) 及更新版本:

版本 7.5中引入了MException 类形式的新错误处理功能。您可以从 MException 对象中获取有关堆栈跟踪的信息,方法是创建并抛出一个“虚拟”异常,然后立即捕获它并访问该字段。如果您在函数中执行以下操作:stack

try
  throw(MException('phony:error',''));
catch ME
  callerStack = {ME.stack.name};
end

然后元胞数组callerStack将包含调用堆栈中所有函数的名称,当前函数名称在第一个元素中,最上面的调用者名称在最后一个元素中。

MATLAB 版本 7.1 (R14SP3) 至 7.4 (R2007a):

对于这些早期版本,您可以使用ERROR函数来引发错误,并使用LASTERROR函数来捕获错误并获取堆栈信息:

try
  error('phony:error','');
catch
  s = lasterror;
  callerStack = {s.stack.name};
end

MATLAB 7.0.4 (R14SP2) 及更早版本:

不幸的是,LASTERROR函数仅在MATLAB 版本 7.1中开始返回堆栈跟踪信息,因此我无法为早期的 MATLAB 版本提供上述解决方案的版本。

于 2010-01-19T15:39:57.780 回答