Остановить и продолжить выполнение из отладчика возможно? - PullRequest
16 голосов
/ 17 июля 2010

Есть ли способ остановить выполнение программы matlab из отладчика, как это делает ctrl + c, но затем иметь возможность продолжить выполнение (как вы можете, скажем, c #)?

Если нет, есть ли лучший способ обойти это, кроме попыток упреждающей установки точек останова или операторов dbstop в вашем коде matlab?

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

В настоящее время я использую / рассматриваю два варианта:

  1. Команды dbstop (или (условные) точки останова) в коде. Недостатком является то, что иногда я не хочу останавливать симуляцию на несколько часов, иногда хочу остановиться через несколько секунд (и я не обязательно знаю это заранее), и это не работает с таким подходом: Если я устанавливаю условие прерывания на прерывание каждые 5 минут, я не могу оставлять Matlab работающим часами без взаимодействия. Если я установлю условие выше, мне придется слишком долго ждать, пока условие будет выполнено.

  2. включает код для сохранения рабочей области каждые несколько секунд / минут и импорта рабочей области во второй экземпляр matlab. Недостаток в том, что это очень хлопотно и не обязательно позволяет мне продолжить симуляцию с состоянием сохраненного рабочего пространства, а затем выполнить код в течение нескольких итераций.

Я надеюсь, что есть лучшее решение, чем любой из 2. Спасибо за любой совет!

Редактировать : Я думаю, что я собираюсь написать простую функцию matlab, которая проверяет переменную среды или файл на диске каждую итерацию и вызывает dbstop, если я установлю флаг в этом файле или env , Таким образом, я могу контролировать, когда (и при необходимости, какой из нескольких) точка останова попадает извне Matlab, редактируя файл. Грязно, но должно работать.

Ответы [ 6 ]

17 голосов
/ 18 июля 2010

Это не обязательно лучший способ, но вы можете смоделировать основанную на файле структуру сигналов / прерываний. Это можно сделать, проверяя время от времени в длинном цикле симуляции наличие определенного файла. Если это так, вы входите в интерактивный режим с помощью команды keyboard.

Что-то вроде:

CHECK_EVERY = 10;    %# like a polling rate

tic
i = 1;               %# loop counter
while true           %# long running loop
    if rem(i,CHECK_EVERY) == 0 && exist('debug.txt','file')
        fprintf('%f seconds since last time.\n', toc)
        keyboard
        tic
    end

    %# ... long calculations ...    

    i = i + 1;
end

Вы бы запускали симуляцию как обычно. Когда вы захотите ввести код, просто создайте файл debug.txt (то есть вручную), и выполнение остановится, и вы получите приглашение:

2.803095 seconds since last time.
K>> 

Затем вы можете проверить свои переменные как обычно ... Чтобы продолжить, просто запустите return (не забудьте временно переименовать или удалить файл). Для выхода используйте dbquit


РЕДАКТИРОВАТЬ: Мне пришло в голову, что вместо проверки файлов проще было бы использовать фиктивную фигуру в качестве флага (пока фигура открыта, продолжайте работать).

hFig = figure; drawnow
while true
    if ~ishandle(hFig)
        keyboard
        hFig = figure; drawnow
    end

    %# ...
    pause(0.5)
end
10 голосов
/ 18 марта 2016

С выпуском R2016a вы можете просто нажать кнопку «Пауза» в редакторе кода, и она сразу остановится. Сочетание клавиш Ctrl + F5.

Чтобы приостановить выполнение программы во время ее работы, на вкладке «Редактор» нажмите кнопку «Пауза». MATLAB приостанавливает выполнение на следующей исполняемой строке *.

Когда ваш код работает, кнопка «Пуск» превратится в паузу:

enter image description here

Еще одно изменение в этом выпуске - возможность добавлять / удалять точки останова во время работы. Раньше, видимо, ты не мог этого сделать.

4 голосов
/ 17 июля 2010

Вы можете установить условную точку останова в редакторе MATLAB. Вы также можете использовать DBSTOP для этого. Например, это установит условную точку останова в файле myFcn в строке 20, которая остановит выполнение, если переменная цикла i кратна 500:

dbstop in myFcn.m at 20 if rem(i,500) == 0

Затем вы можете продолжить выполнение после проверки некоторых из ваших переменных.

2 голосов
/ 30 декабря 2010

Если сохранение рабочей области в файл является хорошим прокси для того, что вы хотите, как насчет создания простого графического интерфейса пользователя с кнопкой переключения.В своем коде проверьте состояние кнопки.Если кнопка нажата, сохраните состояние, обновите статический текст, чтобы отразить отметку времени последнего сохранения, отожмите кнопку.При желании, иметь условную точку останова, основанную на состоянии этой кнопки переключения.

1 голос
/ 22 августа 2013

Вот альтернативное решение, использующее waitinput File Exchange представление .Преимущество состоит в том, что вы можете использовать его во время текущего сеанса или в тех случаях, когда создание файла затруднительно.Также он не оставит файл на компьютере.

Недостаток также есть, к сожалению, вам нужно подождать контрольный момент, прежде чем вы сможете завершить работу, и это будет стоить немного времени.

for t = 1:10
    pause(3) %Doing some calculations
    str = waitinput('Enter 1 if you want to stop ',5);
    if ~isnan(str)
        keyboard; % Enter dbcont if you want to continue from here
    end
    ['moving on, it is now: ' datestr(now)]
    pause(3) %Doing some more calculations
end

Если вы хотите, вы можете запретить вывод строк на экран.В этом случае вам нужно вводить данные в то время, когда окно рисунка открыто (посмотрите на панель запуска в окнах).

Подводя итог, краткий код, который вы можете поместить где-то вроде условной точки останова, будет:

if ~isnan(waitinput('',5))
    keyboard; 
end
0 голосов
/ 11 октября 2016

После определенной версии (я не знаю, какая именно):

Windows: Ctrl + F5
Mac: Command + F5 (наверное)
Unix: я тоже ищу ответ

После 2016a на интерфейсе есть кнопка для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...