在 matlab 中,可以使用 dbstack 在当前时间检索调用堆栈,但是 dbstack 在独立编译的 matlab 程序版本中不可用,是否有另一种方法来获取调用堆栈,或者至少是调用当前函数的函数?我想编写一个需要知道它被谁调用的设施函数,但最好使用完整的调用堆栈。
问问题
1994 次
1 回答
11
到目前为止,解决方案如下:
- 正如您所提到的,函数DBSTACK在MATLAB 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 回答