在 matlab 中,可以使用 dbstack 来检索当前的调用堆栈,但是 dbstack 在独立编译版本的 matlab 程序中不可用,是否有替代方法来获取调用堆栈,或者至少是调用当前函数的函数功能?我想编写一个设施函数,需要知道它是由谁调用的,但最好是完整的调用堆栈。
最佳答案
以下是目前的解决方案:
- 如您所述,函数 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 版本提出的上述解决方案的版本。
关于matlab - 已编译的matlab中的调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2094462/