Техники отладки кода

Beginner

This tutorial is from open-source community. Access the source code

Введение

Код никогда не идеален. В нём всегда будут ошибки. Отладка кода - это навык, который нужно выучить.

Советы по отладке

Итак, ваша программа упала...

$ 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, чтобы улучшить свои навыки.