在matlab中,可以使用dbstack在当前时间检索调用堆栈,但dbstack在matlab程序的独立编译版本中不可用,是否有获取调用堆栈的替代方法,或者至少是调用当前函数的函数功能?我想写一个设施函数,需要知道它被调用的人,但最好是一个完整的调用栈。
答案 0 :(得分:11)
到目前为止,这是解决方案的立场:
但是,我还有一个可能的解决方案,我认为它是“最干净”的解决方案:使用错误处理机制来获取堆栈跟踪。这将根据您使用的MATLAB版本而有所不同......
MException class形式的新错误处理功能为introduced in Version 7.5。您可以通过创建并抛出“虚拟”异常,然后立即捕获并访问stack
field,从MException对象获取有关堆栈跟踪的信息。如果在函数中执行以下操作:
try
throw(MException('phony:error',''));
catch ME
callerStack = {ME.stack.name};
end
然后单元格数组callerStack
将包含调用堆栈中所有函数的名称,第一个元素中的当前函数名称和最后一个元素中最顶层的调用者名称。
对于这些早期版本,您可以使用ERROR函数抛出错误,使用LASTERROR函数捕获错误并获取堆栈信息:
try
error('phony:error','');
catch
s = lasterror;
callerStack = {s.stack.name};
end
不幸的是,LASTERROR函数只在MATLAB Version 7.1中开始返回堆栈跟踪信息,所以我没有为早期的MATLAB版本提供上述解决方案的版本。