Вопрос
Мне нравится отлаживать в matlab с помощью команд.несколько вопросов:
- Если выбрать стек, возможно ли перейти к определенному стеку напрямую вместо перемещения одного стека за другим с помощью dbup и dbdown?
- После перехода к среднему стеку, если я выполняю некоторые команды, почему он автоматически возвращается к самому внутреннему стеку?Могу ли я оставаться в среднем стеке до тех пор, пока не дам команду перейти в другой стек?
Решение
1) Не с клавиатуры.Если вы используете редактор и у вас отображается панель инструментов редактора, то в выпадающем списке "Стек" отображается весь стек вызовов, и вы можете перейти на произвольный уровень.Возможно, вам удастся взломать n-уровневые dbup / dbdown вместе, посмотрев, что находится в этом раскрывающемся списке, но управление debugger очень сложно создать из Matlab из-за взаимодействия отладчика и M-кода, который вы используете для написания сценариев.
2) Если вы выдаете команду из командной строки отладчика "K>>", то по завершении она должна вернуть вам уровень стека, с которого вы ее выдали, как вы и ожидали.У вас все еще установлена точка останова на нижнем уровне кода?Возможно, вы на самом деле видите запрос вторичного отладчика "K>>" из точки останова во вложенном стеке вызовов.По сути, у вас может быть несколько вложенных контекстов отладчика.
Например:
function f1
f2();
function f2()
f3();
function f3()
f4();
function f4()
disp('Hello world');
Если вы добавите его в отладчик подобным образом, вы достигнете точки останова в нижней части стека вызовов, который сам был запущен из исходного сеанса отладчика.
>> dbstop in f1 at 8
>> f1()
8 disp('Hello world');
K>> dbup
In workspace belonging to f1>f3 at 6
K>> dbup
In workspace belonging to f1>f2 at 4
K>> f1()
8 disp('Hello world');
K>> dbstack
> In f1>f4 at 8
In f1>f3 at 6
In f1>f2 at 4
In f1 at 2
In f1>f4 at 8
In f1>f3 at 6
In f1>f2 at 4
In f1 at 2
K>>
Выполнение dbquit (выход из сеанса вложенного отладчика) возвращает вас к середине исходного стека вызовов, на котором вы остановились.
K>> dbquit
K>> dbstack
In f1>f4 at 8
In f1>f3 at 6
> In f1>f2 at 4
In f1 at 2
K>>
Если вы отключите dbcont из своего "K>>", то поток управления возобновится с нижней части стека вызовов, где первоначально была установлена точка останова, независимо от того, на какой фрейм стека смотрит K>>.Вы не можете использовать отладчик для изменения потока управления выполняемым основным кодом.