> · 9 мин

7 приёмов дебаггинга с Claude Code — от «почини баг» до корневой причины за 2 минуты

7 приёмов дебаггинга с Claude Code — от «почини баг» до корневой причины за 2 минуты

7 приёмов дебаггинга с Claude Code — от «почини баг» до корневой причины за 2 минуты

Три часа на один баг. Stack trace, который ведёт в никуда. Console.log, который врёт. Фикс, который работает локально и ломается в проде.

Знакомо? Claude Code может свернуть этот цикл до двух минут — но только если перестать писать fix the bug in my app и начать дебажить правильно.

TL;DR: 7 конкретных паттернов дебаггинга с Claude Code: от пайпинга сырых логов вместо пересказа ошибки — до хуков, которые автоматически логируют упавшие команды. Каждый приём с примером промпта и объяснением, когда он не работает.

Почему «fix the bug» не работает

Вот что происходит, когда пишешь Claude Code что-нибудь вроде fix the bug in my app:

  • Claude читает каждый файл в проекте
  • Тратит тысячи токенов на сканирование
  • Галлюцинирует фикс, который чинит симптом, а не причину

По наблюдениям разработчиков на DEV.to, типичные «быстрые фиксы» от AI — это retry-цикл вместо починки таймаута, try/catch без понимания причины, null-чек без выяснения, откуда пришёл null. Все они проходят тесты. Все всплывают в проде в худшем виде.

Дебаггинг с AI — это не «скинь ошибку и жди». Это дисциплина. Вот 7 приёмов, которые её дают.

Приём 1: Хирургический промпт — ошибка + стектрейс + файлы

Вместо описания бага своими словами — дай Claude сырые данные и укажи, куда смотреть:

claude "I have a bug: TypeError: Cannot read properties of undefined (reading 'map').
Stack trace: at UserList.render (src/components/UserList.jsx:23).
Here's what I know: the data loads correctly on first render but breaks on refresh.
Check src/components/UserList.jsx and src/hooks/useUsers.js"

Три элемента, без которых Claude будет гадать:

  • Точное сообщение об ошибке — не «что-то с базой», а полный текст
  • Stack trace — весь, не только первую строку
  • Подозреваемые файлы — сужают область поиска и экономят токены

По паттернам с DEV.to, этот подход работает потому, что stack trace показывает Claude путь через код, а указание файлов не даёт ему уйти в сканирование всего проекта.

Приём 2: Пайпинг вместо пересказа — 2>&1 | claude

Это, пожалуй, самый недооценённый трюк. Вместо того чтобы копировать ошибку, пересказывать её своими словами и терять детали — просто пайпни вывод команды прямо в Claude:

npm test 2>&1 | claude "fix the failing tests"

По эксперименту на BSWEN, разработчик сравнил два подхода на реальном баге:

  • Пересказ своими словами: 12 минут, результат — generic-советы про изоляцию тестов
  • Пайп сырого вывода: 30 секунд + 2 минуты анализа Claude, результат — точный фикс: «Строка 45 в test-setup.js — пропущен await»

Ключевой момент — 2>&1. Без этого в пайп попадает только stdout, а stderr (где живут сообщения об ошибках) улетает в терминал и теряется.

Ещё несколько полезных вариантов:

# Git конфликты
git diff | claude "help resolve these merge conflicts"

# Docker проблемы
docker logs my-container 2>&1 | claude "explain what's going wrong"

# Сохранить вывод + проанализировать
npm test 2>&1 | tee test-output.log
cat test-output.log | claude "fix the failing tests"

Приём 3: Гипотезы перед фиксом

Когда не понимаешь, что сломалось — не проси Claude чинить. Попроси его думать:

This function returns null when it shouldn't. Before fixing it,
give me 3 possible root causes:

Expected: user object with email field
Actual: null

[код функции]

Зачем это работает: Claude перестаёт хвататься за первый паттерн, который увидит в коде, и вместо этого рассуждает от симптомов. Ты выбираешь гипотезу, которая совпадает с твоим пониманием, и только потом разрешаешь фиксить.

Автор 5-шагового процесса на DEV.to идёт ещё дальше — просит Claude сначала выдвинуть гипотезы без чтения кода, а потом проверить их:

Here's the relevant code: [paste]

We hypothesized these causes: [list from previous step]

Which of these does the code actually support?
What does the code show that our hypotheses missed?

Приём 4: «Объясни, потом чини»

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

Explain what caused it before making any changes.

Без этого Claude иногда чинит симптом и идёт дальше. Добавил null-чек — ошибка ушла. Но почему приходит null — осталось загадкой. А через неделю тот же баг всплывает в другом месте.

С этой строкой Claude вынужден сначала построить модель проблемы, и только потом предложить решение. По опыту Gian Gallegos, это превращает дебаггинг из починки в обучение — ты начинаешь понимать свою кодовую базу лучше.

Приём 5: Стратегия логирования для плавающих багов

Баг воспроизводится через раз? Не проси Claude чинить — попроси расставить логи:

This function is behaving unexpectedly in production but I can't
reproduce it locally. Where should I add logging to narrow down
the cause? Don't fix it yet — just tell me what to log and where.

[код функции]

Claude предложит точки для логирования на основе анализа кода — какие переменные проверить, в каком порядке, что сравнить между успешным и неуспешным запросами. Это часто быстрее, чем угадывать фикс.

Приём 6: Исключения и ограничения — расскажи, что ты уже проверил

Когда ты уже потратил час на баг, у тебя есть ценная информация — что точно не является причиной:

Bug: login form submits but user session isn't persisting.
I've already checked:
- Cookies are being set correctly (verified in DevTools)
- The session middleware is loaded (confirmed in app.ts)
- The database stores the session (checked manually)

Something between session creation and the next request is losing it.
Check src/middleware/auth.ts and src/lib/session.ts

Это экономит Claude десятки тысяч токенов на проверку того, что ты уже исключил, и направляет его к непроверенным участкам.

Для регрессий (сломалось после PR) — перечисли, что менял:

This was working before my last PR. The PR changed:
- Added rate limiting middleware
- Updated the user schema
- Changed auth token validation

Now I'm getting: [error]
Which change most likely caused this and why?

Приём 7: Хук для автоматического логирования ошибок

Это продвинутый приём — настроить hook, который автоматически записывает каждую упавшую Bash-команду в лог:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{
          "type": "command",
          "command": "python .claude/hooks/log_failures.py"
        }]
      }
    ]
  }
}

Скрипт .claude/hooks/log_failures.py:

import json, sys
from pathlib import Path
from datetime import datetime

data = json.load(sys.stdin)
if data.get("tool_name") == "Bash":
    result = data.get("tool_result", {})
    if result.get("exit_code", 0) != 0:
        log = Path(".claude/debug.log")
        ts = datetime.now().strftime("%H:%M:%S")
        cmd = data.get("tool_input", {}).get("command", "")[:100]
        out = result.get("output", "")[:300]
        with log.open("a") as f:
            f.write(f"[{ts}] FAILED: {cmd}\nOutput: {out}\n\n")
sys.exit(0)

По паттерну с DEV.to, это создаёт .claude/debug.log, который накапливает все ошибки за сессию. Удобно для post-mortem: можно скормить весь лог Claude и попросить найти закономерность.

Бонус: секция дебаггинга в CLAUDE.md

Если проект живой и баги повторяются — добавь в CLAUDE.md раздел с типичными паттернами ошибок:

## Common Error Patterns

- `NullReferenceError` on user object: Usually means the Prisma query
  is missing `include: { profile: true }`. Check the repository layer.

- `TimeoutError` on external calls: All external API calls need
  explicit timeout configuration. See `src/lib/http.ts` for the wrapper.

## Debugging Tools
- Logs: `logs/app.log` (JSON format, use jq)
- DB inspection: `npm run db:studio`

Claude прочитает это в начале сессии и сразу будет знать, куда смотреть при знакомых ошибках.

Подводные камни

Claude чинит симптомы, а не причины. Без инструкции «explain before fixing» типичный фикс — это null-чек или try/catch, который маскирует проблему. По наблюдениям builtbyzac, такие фиксы всплывают в проде через 2 дня в худшем виде: retry-цикл вместо починки таймаута, перехват исключения без понимания причины.

Пайпинг больших логов убивает контекст. Если npm test 2>&1 выдаёт 10 000 строк, Claude потратит весь контекст на парсинг мусора. Для длинных логов лучше сначала сохранить в файл (tee), потом отфильтровать нужное (grep -A5 "ERROR") и скормить только релевантную часть.

Несколько изменений за раз = непонятно, что починило. Если Claude предложил три фикса одновременно и баг ушёл — ты не знаешь, какой из трёх сработал. По опыту с BSWEN, правильный подход — тестировать гипотезы по одной, как в научном эксперименте.

Claude зацикливается на долгих сессиях. По наблюдениям разработчиков, на длинных задачах Claude попадает в два режима: бесконечный цикл (одна и та же ошибка, слегка разные подходы) или расширение scope (начинает рефакторить код вокруг бага). Если заметил — останови, дай /clear и переформулируй задачу узко.

Shared state между системами — не баг модели, а баг архитектуры. Разработчик на rentierdigital потратил три дня, обвиняя Claude в генерации «мусорного кода», пока не осознал: 5 систем писали в одно поле, каждый фикс ломал соседнюю систему. Модель была ни при чём — не было интеграционного теста, который прогоняет все трансформации последовательно.

Вердикт

Из всех 7 приёмов три дают максимальный эффект: пайпинг сырых логов (приём 2) убирает потерю информации при пересказе; гипотезы перед фиксом (приём 3) не дают Claude чинить симптомы; «объясни, потом чини» (приём 4) превращает дебаггинг из лотереи в понимание. Остальные — усилители: хук для логов полезен на больших проектах, секция в CLAUDE.md окупается при повторяющихся ошибках, а ограничения экономят токены на том, что ты уже проверил.

Главное правило: Claude Code — не телепат. Чем точнее входные данные, тем точнее диагноз. Stack trace → гипотезы → объяснение → фикс → тест. В этом порядке.

Как попробовать

  1. Прямо сейчас: в следующий раз, когда упадёт тест, вместо копипасты ошибки напиши npm test 2>&1 | claude "fix the failing tests" — и сравни результат с обычным подходом
  2. Добавь в CLAUDE.md раздел ## Common Error Patterns с 3-5 типичными ошибками вашего проекта
  3. Попробуй промпт с гипотезами: при следующем непонятном баге напиши Before fixing it, give me 3 possible root causes — это займёт 30 секунд, но сэкономит 30 минут
  4. Установи хук для логов: скопируй скрипт log_failures.py из приёма 7, через неделю у тебя будет картина типичных ошибок в проекте
  5. Официальная документация Claude Code по best practices — раздел про дебаггинг
$ ls ./related/

Похожие статьи

subscribe.sh

$ cat /dev/blog/updates

> Свежие заметки о программировании,

> DevOps и AI — прямо в мессенджер

./subscribe