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

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

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

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

Ценю ваши вклады и предложения. Благодарю вас!!!

1 ответ

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам