Изменение кода во время выполнения при отладке

Я использую Eclipse Kepler Service Release 2, EPIC 0.5.46 и Strawberry Perl 5 версии 18 для программирования на Perl. Для отладки я использую отладчик Eclipse и PadWalker.

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

Есть ли способ внести изменения в код подпрограммы в середине сеанса отладки, чтобы указатель инструкций сбрасывался на первую строку этой подпрограммы? Такого способа у меня нет. чтобы перезапустить сеанс, чтобы перекомпилировать новый код.

Благодарим вас за вклад и предложения. Благодарю вас!!!


person Chiseled    schedule 21.05.2014    source источник


Ответы (1)


То, что вы хотите сделать, можно сделать, и я сам много раз делал это на Perl. Например, см. это.

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

Во-первых, нужно принять обычную структуру команд, такую ​​как командный процессор или, скажем, веб-сервер.

В командном процессоре или веб-сервере вы читаете команду (или получаете веб-запрос), выполняете действие, затем читаете другую команду, выполняете другое действие и так далее. Судя по твоему описанию, у тебя такая конструкция.

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

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

Специальная конструкция Perl для этого называется do. Не используйте require или use, которые загрузят файл Perl, только если этот файл или модуль не были загружены ранее. В вашей ситуации вы хотите перезагрузить, даже если он был загружен ранее.

Итак, как теперь получить возможность выполнять команду do? Как вы предлагаете, вы можете сделать это через отладчик. Предполагая, что у вас есть эта общая структура программы, как описано выше, вы помещаете точку останова где-то в общей точке вызывающей программы, которая зацикливается на том, что нужно обработать, а не пытается изменить что-то в отдельных командах.

И вам даже не нужен отладчик для этого! Многие веб-фреймворки, такие как Ruby on Rails, имеют режим «разработки», в котором они сохраняют метки времени в файлах, реализующих функциональные возможности. Если файл изменился, они перед выполнением запроса выдают команду «do».

person Community    schedule 18.05.2015