← Назад к вопросам

Что такое Python Debugger (PDB)?

3.0 Senior🔥 241 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Python Debugger (PDB) — отладчик Python

PDB (Python Debugger) — это встроенный интерактивный отладчик для Python. Он позволяет выполнять код пошагово, инспектировать переменные, устанавливать точки останова и отслеживать ошибки. PDB входит в стандартную библиотеку и доступен из коробки.

Почему PDB важен

  1. Отладка — находить баги без print() вызовов
  2. Понимание кода — пошаговое выполнение логики
  3. Инспекция состояния — смотреть значения переменных
  4. Контроль потока — прыгать через функции или выполнять построчно
  5. Встроенный — не нужно устанавливать дополнительные пакеты

Запуск PDB

Способ 1: breakpoint() — новый стиль (Python 3.7+)

def calculate_total(items):
    total = 0
    for item in items:
        breakpoint()  # Здесь произойдёт остановка
        total += item.price * item.quantity
    return total

calculate_total([Item(10, 2)])

Выполнение программы остановится в точке breakpoint() и откроется сессия PDB.

Способ 2: pdb.set_trace() — классический способ

import pdb

def calculate_total(items):
    total = 0
    for item in items:
        pdb.set_trace()  # То же самое, что breakpoint()
        total += item.price * item.quantity
    return total

Способ 3: запуск скрипта с PDB

python -m pdb script.py

Способ 4: post-mortem отладка (после ошибки)

import pdb
import traceback

try:
    calculate_total(items)
except Exception:
    traceback.print_exc()
    pdb.post_mortem()  # Откроет отладчик в месте ошибки

Основные команды PDB

Навигация по коду:

n (next)        — выполнить следующую строку
s (step)        — зайти внутрь функции
c (continue)    — продолжить выполнение до следующего breakpoint
l (list)        — показать текущий код (5 строк вверх/вниз)
p variable      — распечатать значение переменной
pp expression   — красивый вывод сложного объекта

Просмотр контекста:

w (where)       — показать стек вызовов
u (up)          — перейти на уровень выше в стеке
d (down)        — перейти на уровень ниже в стеке
args            — показать аргументы текущей функции

Точки останова:

b (break) file.py:10  — установить breakpoint на строку 10
cl (clear)            — удалить все breakpoints
h (help)              — справка по командам

Выполнение выражений:

!variable = value     — изменить значение переменной
!import sys           — выполнить код Python

Практический пример

Код с ошибкой:

def divide_numbers(a, b, c):
    result = (a + b) / c
    return result * 100

print(divide_numbers(10, 5, 0))  # ZeroDivisionError!

Добавляем breakpoint:

def divide_numbers(a, b, c):
    breakpoint()  # Остановка здесь
    result = (a + b) / c
    return result * 100

print(divide_numbers(10, 5, 0))

Сессия отладки:

> /path/to/script.py(2)divide_numbers()
-> result = (a + b) / c

(Pdb) p a
10
(Pdb) p b
5
(Pdb) p c
0
(Pdb) p a + b
15
(Pdb) l
  1     def divide_numbers(a, b, c):
  2  -> result = (a + b) / c
  3         return result * 100

(Pdb) n  # Выполнить следующую строку
ZeroDivisionError: division by zero

Сложный пример: отладка цикла

def process_users(users):
    results = []
    for user in users:
        breakpoint()  # Отладка каждого пользователя
        user_data = {
            'id': user['id'],
            'name': user['name'].upper(),
            'email': user.get('email', 'N/A')
        }
        results.append(user_data)
    return results

users = [
    {'id': 1, 'name': 'alice', 'email': 'alice@example.com'},
    {'id': 2, 'name': 'bob'},
]

process_users(users)

Сессия:

(Pdb) p user
{'id': 1, 'name': 'alice', 'email': 'alice@example.com'}
(Pdb) pp user_data
{'id': 1,
 'name': 'ALICE',
 'email': 'alice@example.com'}
(Pdb) c  # Продолжить

> /path/to/script.py(10)process_users()
-> for user in users:

(Pdb) p user
{'id': 2, 'name': 'bob'}
(Pdb) p user.get('email', 'N/A')
'N/A'

Условные Breakpoints

def find_user(users, target_id):
    for user in users:
        if user['id'] == target_id:
            breakpoint()  # Остановка только для нужного пользователя
        process_user(user)

# Или более красивый способ:
def find_user(users, target_id):
    for user in users:
        if user['id'] == target_id:
            pdb.set_trace()
        process_user(user)

PDB и IDE

PyCharm — встроенный отладчик превосходит PDB, но PDB всё равно полезен:

  • F7 для step into
  • F8 для next
  • F9 для continue

VS Code — встроенный отладчик с визуальным интерфейсом

Vim — используй PDB в терминале

Советы профессионалов

  1. Используй pp() для больших объектов
(Pdb) pp large_dict
  1. Цикл по стеку вызовов
(Pdb) w  # показать стек
(Pdb) u  # поднять на уровень
(Pdb) d  # опуститься
  1. Встроенная справка
(Pdb) h n  # справка по команде 'n'
  1. Не забывай exit из PDB
(Pdb) q  # quit

Сравнение подходов отладки

print() — плохо

print(f"user = {user}")
print(f"total = {total}")
# Много строк, нужно удалять после

logging — лучше

logger.debug(f"user = {user}")
# Остаётся в коде, легко отключить

PDB — лучше всего для отладки

breakpoint()  # Интерактивная инспекция
# Вся информация под рукой

PDB — это мощный инструмент, который должен знать каждый Python разработчик. Он сэкономит вам часы на отладку сложных проблем.

Что такое Python Debugger (PDB)? | PrepBro