![]() |
在已编译的Matlab中调用堆栈
在matlab中,可以在当前时间使用dbstack来检索调用堆栈,但是dbstack在matlab程序的独立编译版本中不可用,是否有替代方法来获取调用堆栈,或者至少是调用当前函数的函数?我想编写一个设施函数,需要知道谁被调用,但是最好使用完整的调用堆栈。
[B]回答:[/B] 到目前为止,这里的解决方案是: [LIST][*]如您所述,函数[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dbstack.html"]DBSTACK[/URL] [URL="http://www.mathworks.com/access/helpdesk/help/toolbox/compiler/br2cqa0-20.html"]在MATLAB编译器不支持的函数列表中[/URL] ,因此无法使用。[*]您还在评论中提到,即使函数[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/evalin.html"]EVALIN[/URL]不在不受支持的函数列表中,您的编译器仍然不允许您使用它。最后,我拒绝了我之前提出的一些解决方案。[*]由于必须进行维护,因此必须通过在函数调用链中传递参数(或可能通过将其存储在[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/global.html"]全局变量中[/URL] )来维护自己的堆栈跟踪,这不是理想的选择。[/LIST]但是,我还有另外一种可能的解决方案,我认为这是“最干净的”解决方案:使用错误处理机制来获取堆栈跟踪。这将根据您使用的MATLAB版本而有所不同... [B] MATLAB版本7.5(R2007b)和更高版本: [/B] [URL="http://www.mathworks.com/access/helpdesk/help/techdoc/rn/brb410y-1.html#brb79wb-1"]在7.5版[/URL]中[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/rn/brb410y-1.html#brb79wb-1"]引入[/URL]了[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/bq9l448-1.html"]MException类[/URL]形式的新错误处理功能。通过创建并抛出“虚拟”异常,然后立即捕获并访问[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/bq9l448-1.html#bq9no0f-1"]stack字段[/URL] ,可以从MException对象获取有关堆栈跟踪的信息。如果在函数中执行以下操作: try throw(MException('phony:error','')); catch ME callerStack = {ME.stack.name}; end 然后,单元数组callerStack将包含调用堆栈中所有函数的名称,第一个元素中包含当前函数名称,最后一个元素中包含最高调用者名称。 [B] MATLAB版本7.1(R14SP3)至7.4(R2007a): [/B] 对于这些早期版本,您可以使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/error.html"]ERROR[/URL]函数引发错误,并使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/lasterror.html"]LASTERROR[/URL]函数捕获错误并获取堆栈信息: try error('phony:error',''); catch s = lasterror; callerStack = {s.stack.name}; end [B] MATLAB版本7.0.4(R14SP2)和更早版本: [/B] 不幸的是, [URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/lasterror.html"]LASTERROR[/URL]函数仅在[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/rn/f30-1008061.html#f30-1007471"]MATLAB 7.1版中[/URL]才开始返回堆栈跟踪信息,因此对于较早的MATLAB版本,我无法提供上述解决方案的版本。 [url=https://stackoverflow.com/questions/2094462]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 05:08。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.