在编译的matlab中调用堆栈

时间:2010-01-19 15:13:49

标签: matlab callstack matlab-compiler

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

1 个答案:

答案 0 :(得分:11)

到目前为止,这是解决方案的立场:

  • 如您所述,函数DBSTACK位于list of functions that are not supported by the MATLAB Compiler,因此无法使用。
  • 您还在评论中提到,即使函数EVALIN不在不受支持的函数列表中,您的编译器仍然不允许您使用它。最终拒绝了我建议的一些先前的解决方案。
  • 通过在函数调用链中传递参数(或者可能将它们存储在global variable中)来维护自己的堆栈跟踪不是一个理想的选择,因为它需要维护的复杂性和额外工作

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

MATLAB版本7.5(R2007b)及更新版本:

MException class形式的新错误处理功能为introduced in Version 7.5。您可以通过创建并抛出“虚拟”异常,然后立即捕获并访问stack field,从MException对象获取有关堆栈跟踪的信息。如果在函数中执行以下操作:

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 Version 7.1中开始返回堆栈跟踪信息,所以我没有为早期的MATLAB版本提供上述解决方案的版本。