matlab - 已编译的matlab中的调用堆栈

标签 matlab callstack matlab-compiler

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

最佳答案

以下是目前的解决方案:

  • 如您所述,函数 DBSTACKlist 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/

相关文章:

MatLab 错误 : cannot open with static TLS

r - 使用模式进行 Matlab 字符串操作的 R stringr 替代方案是什么?

R: promise 已在评估中

.net - 从 dot net 运行 Matlab 代码

c++ - 将 Matlab 转换为 C++

c++ - 我们如何调试在 C++ 应用程序中使用的 matlab 制作的 DLL?

matlab - 如何在Matlab神经网络中每次迭代后获得权重矩阵?

matlab - 在 Matlab 中按下一个键停止无限循环

c++ - 生成所有可能调用堆栈的树

c++ - 是什么导致无法在 DWARF perf 调用堆栈中展开?