Введение
Код никогда не идеален. В нём всегда будут ошибки. Отладка кода - это навык, который нужно выучить.
Советы по отладке
Итак, ваша программа упала...
$ python3 blah.py
Traceback (most recent call last):
File "blah.py", line 13, in?
foo()
File "blah.py", line 10, in foo
bar()
File "blah.py", line 7, in bar
spam()
File "blah.py", 4, in spam
line x.append(3)
AttributeError: 'int' object has no attribute 'append'
Теперь что делать?!
Чтение трассировок стека
Последняя строка - это конкретная причина аварии.
## Cause of the crash
Однако, не всегда легко прочитать или понять.
ПРО-ТИП: Вставьте всю трассировку стека в Google.
Использование интерактивного интерпретатора Python (REPL)
Используйте параметр -i, чтобы запустить скрипт и оставить Python запущенным.
$ python3 -i blah.py
Traceback (most recent call last):
File "blah.py", line 13, in?
foo()
File "blah.py", line 10, in foo
bar()
File "blah.py", line 7, in bar
spam()
File "blah.py", 4, in spam
line x.append(3)
AttributeError: 'int' object has no attribute 'append'
>>>
Это сохраняет состояние интерпретатора. Это означает, что вы можете исследовать состояние программы после аварии. Проверять значения переменных и другое состояние.
Дебаггинг с использованием print
Дебаггинг с использованием print() - это довольно распространенный метод.
Совет: убедитесь, что используете repr()
def spam(x):
print('DEBUG:', repr(x))
...
repr() показывает точное представление значения. Не красивый вывод для печати.
>>> from decimal import Decimal
>>> x = Decimal('3.4')
## БЕЗ `repr`
>>> print(x)
3.4
## С `repr`
>>> print(repr(x))
Decimal('3.4')
>>>
Отладчик Python
Вы можете вручную запустить отладчик внутри программы.
def some_function():
...
breakpoint() ## Войти в отладчик (Python 3.7+)
...
Это запускает отладчик при вызове breakpoint().
В более ранних версиях Python вы делали так. Иногда вы можете встретить это в других руководствах по отладке.
import pdb
...
pdb.set_trace() ## Вместо `breakpoint()`
...
Запуск под отладчиком
Вы также можете запустить целую программу под отладчиком.
$ python3 -m pdb someprogram.py
Он автоматически войдет в отладчик перед первой инструкцией. Позволяя вам установить точки останова и изменить конфигурацию.
Общие команды отладчика:
(Pdb) help ## Получить помощь
(Pdb) w(here) ## Распечатать стек вызовов
(Pdb) d(own) ## Переместиться на один уровень вниз по стеку
(Pdb) u(p) ## Переместиться на один уровень вверх по стеку
(Pdb) b(reak) loc ## Установить точку останова
(Pdb) s(tep) ## Выполнить одну инструкцию
(Pdb) c(ontinue) ## Продолжить выполнение
(Pdb) l(ist) ## Показать исходный код
(Pdb) a(rgs) ## Распечатать аргументы текущей функции
(Pdb)!statement ## Выполнить инструкцию
Для точек останова местоположение может быть одним из следующих.
(Pdb) b 45 ## Строка 45 в текущем файле
(Pdb) b file.py:45 ## Строка 45 в файле file.py
(Pdb) b foo ## Функция foo() в текущем файле
(Pdb) b module.foo ## Функция foo() в модуле
Упражнение 8.4: Баги? Какой-то баг?
Программа работает. Отправляйте ее!
Резюме
Поздравляем! Вы завершили лабораторную работу по дебаггингу. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.