Вопрос

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

Это было полезно?

Решение

Вот где на данный момент находятся решения:

  • Как вы упомянули, функция DBSTACK - БАЗА ДАННЫХ находится на список функций, которые не поддерживаются компилятором MATLAB, так что он не может быть использован.
  • Вы также упомянули в комментарии, что, хотя функция ОЦЕНИВАЮЩИЙ отсутствует в списке неподдерживаемых функций, ваш компилятор по-прежнему не позволит вам использовать его.Это привело к отклонению некоторых из предыдущих решений, которые я предложил.
  • Необходимость поддерживать вашу собственную трассировку стека, передавая аргументы по цепочке вызовов функций (или, возможно, сохраняя их в глобальная переменная) не является идеальным вариантом из-за сложности и дополнительной работы, которые потребовались бы для обслуживания.

Однако у меня есть еще одно возможное решение, которое, на мой взгляд, пока является самым "чистым":использование механизмов обработки ошибок для доступа к трассировке стека.Это будет зависеть от используемой вами версии 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):

Для этих более ранних версий вы можете использовать ОШИБКА функция для выдачи ошибки и ПОСЛЕДНЯЯ ОШИБКА функция для фиксации ошибки и получения информации о стеке:

try
  error('phony:error','');
catch
  s = lasterror;
  callerStack = {s.stack.name};
end

MATLAB версий 7.0.4 (R14SP2) и более ранних:

К сожалению, в ПОСЛЕДНЯЯ ОШИБКА функция только начала возвращать информацию трассировки стека в MATLAB Версии 7.1, таким образом, нет версии вышеуказанных решений, которые я мог бы предложить для более ранних версий MATLAB.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top