Стек вызовов в скомпилированном matlab - PullRequest
4 голосов
/ 19 января 2010

В matlab можно использовать dbstack для получения стека вызовов в текущий момент, однако dbstack недоступен в автономных скомпилированных версиях программ matlab, есть ли альтернатива для получения стека вызовов или, по крайней мере, функции, вызывающей текущий функционировать? Я хочу написать функцию объекта, которая должна знать, кем она была вызвана, но полный стек вызовов был бы предпочтительным.

1 Ответ

11 голосов
/ 19 января 2010

Вот где решения пока стоят:

  • Как вы упомянули, функция DBSTACK находится в списке функций, которые не поддерживаются компилятором MATLAB, поэтому его нельзя использовать.
  • Вы также упомянули в комментарии, что, хотя функции EVALIN нет в списке неподдерживаемых функций, ваш компилятор все равно не будетПозвольте вам использовать это.Это привело к тому, что мы отвергли некоторые из предыдущих решений, которые я предложил.
  • Необходимость поддерживать собственную трассировку стека, передавая аргументы по цепочке вызовов функций (или, возможно, сохраняя их в глобальной переменной ) не является идеальным вариантом из-за сложности и дополнительной работы, которую потребуется для его обслуживания.

Однако у меня есть еще одно возможное решение, которое я считаю наиболее «чистым» из всех: использование ошибкимеханизмы обработки, чтобы получить в стеке трассировки.Это зависит от версии MATLAB, которую вы используете ...

MATLAB версии 7.5 (R2007b) и новее:

Новые возможности обработки ошибок в виде класса MException были введены в версии 7.5 .Вы можете получить информацию о трассировке стека от объектов MException, создав и выдав «фиктивное» исключение, затем немедленно перехватив его и получив доступ к полю stack .Если вы сделаете следующее в функции:

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 версии 7.1 , поэтому нет версии вышеупомянутых решений, которую я мог бы предложить для более ранних версий MATLAB.

...