Статьи

Python 101: введение в отладчик Python

Python поставляется с собственным модулем отладчика, который называется pdb . Этот модуль предоставляет интерактивный отладчик исходного кода для ваших программ на Python. Вы можете устанавливать точки останова, проходить по коду, проверять кадры стека и многое другое. Мы рассмотрим следующие аспекты модуля:

  • Как запустить отладчик
  • Проходя через ваш код
  • Установка точек останова

Давайте начнем с создания быстрого фрагмента кода, чтобы попытаться выполнить отладку. Вот глупый пример:

# debug_test.py
 
#----------------------------------------------------------------------
def doubler(a):
    """"""
    result = a*2
    print(result)
    return result
 
#----------------------------------------------------------------------
def main():
    """"""
    for i in range(1,10):
        doubler(i)
 
if __name__ == "__main__":
    main()

Теперь давайте узнаем, как запустить отладчик для этого фрагмента кода.


Как запустить отладчик

Вы можете запустить отладчик тремя разными способами. Во-первых, просто импортируйте его и вставьте ** pdb.set_trace () ** в ваш код, чтобы запустить отладчик. Вы можете импортировать отладчик в IDLE и запустить его модуль. Или вы можете вызвать отладчик в командной строке. Мы сосредоточимся на последних двух методах в этом разделе. Начнем с использования его в интерпретаторе (IDLE). Откройте терминал (окно командной строки) и перейдите туда, где вы сохранили приведенный выше пример кода. Затем запустите Python. Теперь сделайте следующее:

>>> import debug_test
>>> import pdb
>>> pdb.run('debug_test.main()')
> <string>(1)<module>()
(Pdb) continue
2
4
6
8
10
12
14
16
18
>>>

Здесь мы импортируем наш модуль и pdb. Затем мы выполняем метод run в pdb и говорим ему вызвать основной метод нашего модуля . Это вызывает подсказку отладчика. Здесь мы набрали продолжить, чтобы сказать, что нужно идти вперед и запустить скрипт. Вы также можете ввести букву c в качестве ярлыка для продолжения . Когда вы продолжите, отладчик продолжит выполнение, пока не достигнет точки останова или сценария не завершится.

Другой способ запустить отладчик — выполнить следующую команду через сеанс терминала:

python -m pdb debug_test.py

Если вы запустите его таким образом, вы увидите немного другой результат:

-> def doubler(a):
(Pdb) c
2
4
6
8
10
12
14
16
18
The program finished and will be restarted

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

Давайте копнем немного глубже и узнаем, как пройтись по коду.


Пошаговое выполнение кода

Если вы хотите пошагово просматривать код по одной строке за раз, тогда вы можете использовать команду step (или просто «s»). Вот сеанс для вашего просмотра:

C:\Users\mike>cd c:\py101
 
c:\py101>python -m pdb debug_test.py
> c:\py101\debug_test.py(4)<module>()
-> def doubler(a):
(Pdb) step
> c:\py101\debug_test.py(11)<module>()
-> def main():
(Pdb) s
> c:\py101\debug_test.py(16)<module>()
-> if __name__ == "__main__":
(Pdb) s
> c:\py101\debug_test.py(17)<module>()
-> main()
(Pdb) s
--Call--
> c:\py101\debug_test.py(11)main()
-> def main():
(Pdb) next
> c:\py101\debug_test.py(13)main()
-> for i in range(1,10):
(Pdb) s
> c:\py101\debug_test.py(14)main()
-> doubler(i)
(Pdb)

Здесь мы запускаем отладчик и говорим ему войти в код. Он начинается сверху и проходит через первые два определения функций. Затем он достигает условия и обнаруживает, что должен выполнить основную функцию. Мы входим в основную функцию и затем используем следующую команду. Следующая команда будет выполнять функцию с именем , если он встречает ее , не заходя в него. Если вы хотите войти в вызываемую функцию, вам нужно будет просто использовать команду step .

Когда вы видите строку типа > c: \ py101 \ debug_test.py (13) main () , вам нужно обратить внимание на число в скобках. Этот номер является текущим номером строки в коде.

Вы можете использовать args (или a ), чтобы вывести текущий список аргументов на экран. Другая удобная команда — это переход (или j ), за которым следуют пробел и номер строки, на которую вы хотите «перейти». Это дает вам возможность пропустить кучу монотонных шагов, чтобы добраться до линии, к которой вы хотите добраться. Это приводит нас к изучению точек останова!


Установка точек останова

Точка останова — это строка в коде, где вы хотите приостановить выполнение. Вы можете установить точку останова, вызвав команду ** break ** (или ** b **), за которой следует пробел и номер строки, по которой вы хотите разбить. Вы также можете добавить в префикс номера строки имя файла и двоеточие, чтобы указать точку останова в другом файле. Команда break также позволяет вам установить точку останова с помощью аргумента ** function **. Существует также команда ** tbreak **, которая устанавливает временную точку останова, которая автоматически удаляется при попадании.

Вот пример:

c:\py101>python -m pdb debug_test.py
> c:\py101\debug_test.py(4)<module>()
-> def doubler(a):
(Pdb) break 6
Breakpoint 1 at c:\py101\debug_test.py:6
(Pdb) c
> c:\py101\debug_test.py(6)doubler()
-> result = a*2

Мы запускаем отладчик, а затем говорим ему установить точку останова в строке 6. Затем мы продолжаем, и он останавливается в строке 6, как положено. Сейчас самое время проверить список аргументов, чтобы убедиться, что вы ожидаете этого. Попробуйте, набрав args прямо сейчас. Затем сделайте еще одно продолжение и еще один аргумент, чтобы увидеть, как это изменилось.


Завершение

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