Можно ли сделать шаг назад в pdb?
После того, как я нажму n, чтобы оценить строку, я хочу вернуться назад, а затем нажать s, чтобы войти в эту функцию, если она не удалась. Это возможно?
Документы говорят:
j (ump) lineno Установите следующую строку, которая будет выполнена. Доступно только в самом нижнем кадре. Это позволяет вам вернуться назад и снова выполнить код или перейти вперед, чтобы пропустить код, который вы не хотите запускать.
4 ответа
Отладчик GNU, gdb: он очень медленный, поскольку одновременно отменяет одну машинную инструкцию.
Отладчик Python, pdb: jump
Команда возвращает вас назад в коде, но не меняет состояние программы.
По этой причине для Python был создан расширенный прототип отладчика python, epdb. Вот тезис, а вот программа и код.
Я использовал epdb в качестве отправной точки для создания живого обратного отладчика, как часть моей степени магистра. Тезис доступен онлайн: сочетание обратной отладки и живого программирования в направлении визуального мышления в компьютерном программировании. В главах 1 и 2 я также рассмотрю большинство исторических подходов к обратной отладке.
PyPy начал реализовывать RevDB, который поддерживает обратную отладку.
Он (по состоянию на февраль 2017 года) все еще находится на стадии альфа-версии, поддерживает только Python 2.7, работает только в Linux или OS X и требует от вас сборки Python из специальной ревизии. Это также очень медленно и использует много оперативной памяти. Цитировать страницу Bitbucket:
Обратите внимание, что файл журнала обычно увеличивается со скоростью 1-2 МБ в секунду. Предполагая, что размер не является проблемой, ограничивающим фактором являются:
- Время переигровки. Если ваше записанное исполнение заняло более нескольких минут, воспроизведение будет мучительно медленным. Иногда необходимо просмотреть весь журнал несколько раз за один сеанс. Если ошибка возникает случайно, но редко, вам следует запустить запись на несколько минут, затем завершить процесс и повторить попытку несколько раз, пока не произойдет сбой.
- Использование оперативной памяти для воспроизведения. Требования к оперативной памяти в 10 или 15 раз больше для воспроизведения, чем для записи. Если это слишком много, вы можете попробовать с более низким значением MAX_SUBPROCESSES в _revdb/process.py, но оно всегда будет в несколько раз больше.
Подробности в блоге PyPy, а инструкции по установке и использованию - на странице BitBucket RevDB.
Обратная отладка (возврат к ранее записанному состоянию приложения или отладка в один шаг назад) обычно является функцией отладчика сборки или уровня C. Например, GDB может сделать это:
https://sourceware.org/gdb/wiki/ReverseDebug
Двунаправленная (или обратная) отладка
Обратная отладка является чрезвычайно сложной и может привести к снижению производительности в 50000 раз. Это также требует обширной поддержки от инструментов отладки. Виртуальная машина Python не обеспечивает поддержку обратной отладки.
Если вы тестируете Python-код в интерактивном режиме, я предлагаю попробовать IPython Notebook, который предоставляет основанные на HTML интерактивные оболочки Python. Вы можете легко написать свой код и смешать и сопоставить заказ. Хотя нет поддержки отладки в pdb. Существует ipdb, который обеспечивает лучшую историю и средства поиска для введенных команд отладки, но, насколько я знаю, он также не выполняет прямые переходы назад.
Хотя вы, возможно, не сможете вовремя обратить выполнение кода вспять, следующая лучшая вещь
pdb
has — переходы между кадрами стека.
Использовать
w
чтобы увидеть, где вы находитесь в кадре стека (нижний — самый новый), и
u(p)
или же
d(own)
чтобы пройти вверх по фрейму стека, чтобы получить доступ к фрейму, в котором вызов функции привел вас в текущий фрейм.