Подтвердить что ты не робот

Прекратить и продолжить выполнение отладчика?

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

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

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

Два варианта, которые я сейчас использую/рассматриваю, -

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

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

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

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

4b9b3361

Ответ 1

Это не обязательно лучший способ, но вы можете имитировать файловую систему сигналов/прерываний. Это можно сделать, проверяя время от времени внутри длинного цикла моделирования для существования определенного файла. Если это так, вы вводите интерактивный режим, используя команду 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


EDIT: Только что произошло, вместо того, чтобы проверять файлы, проще было бы использовать фиктивную фигуру в качестве флага (пока фигура открыта, продолжайте работать).

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

    %# ...
    pause(0.5)
end

Ответ 2

С выпуском R2016a вы можете просто нажать кнопку "Пауза" в редакторе кода, и он сразу же остановится.

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

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

введите описание изображения здесь

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Windows: Ctrl + F5
Mac: Command + F5 (я думаю)
Unix: Я тоже ищу ответ.

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