Debugowanie z Claude Code w terminalu
ENDebugowanie z Claude Code to czterokrokowa pętla w terminalu: przekaż błąd potokiem razem z kontekstem, zbadaj go w trybie planowania, w którym nic nie jest edytowane, udowodnij przyczynę źródłową testem, który nie przechodzi, a potem naprawiaj, aż ten test i cały zestaw testów przejdą. Regresje i awarie CI obsługują git bisect run oraz headless claude -p.
Ta strona jest dla programistów, którzy debugują w terminalu z Claude Code, i dla tech leadów, którzy decydują, czego ma dowodzić pull request z poprawką błędu. Sytuacja: CI świeci na czerwono z komunikatem Cannot read properties of undefined (reading 'map'), stack trace przechodzi przez sześć plików w dwóch serwisach, a ostatni merge zmienił 40 plików. Wklejasz błąd i prosisz o poprawkę. Claude dodaje sprawdzenie na null, CI robi się zielone, a tydzień później ten sam błąd wraca z innego miejsca wywołania.
Agent nie zawiódł jako programista. Poproszono go o edycję, zanim ktokolwiek znał przyczynę. Poniższy przepływ każe mu szukać, dopóki przyczyna nie zostanie udowodniona, a dowodem jest test, który sprawdzisz bez czytania każdej linii poprawki.
Co zyskujesz z debugowania w terminalu
Dział zatytułowany „Co zyskujesz z debugowania w terminalu”- Sposób na przekazanie Claude Code wyjścia testów, serwera, logów i CI potokiem, bez kopiowania
- Etap badania tylko do odczytu w trybie planowania i regułę, kiedy go opuścić
- Dziesięć promptów do skopiowania: zgłoszenie błędu, ograniczona poprawka, stack trace z produkcji, błędy typów, wyścigi, rosnące zużycie pamięci, awarie tylko w CI, podejrzane commity bez znanego dobrego, równoległe śledztwo z subagentami i triage CI
- Przepis na
git bisect run, który radzi sobie z niestabilnymi testami - Listę dowodów, na podstawie której recenzent zatwierdzi poprawkę bez czytania całego diffu
- Sposoby wyjścia z sześciu typowych awarii debugowania z Claude Code
Jak działa pętla debugowania w Claude Code?
Dział zatytułowany „Jak działa pętla debugowania w Claude Code?”Każda faza ogranicza, co Claude może zmienić. To ograniczenie, a nie model, przerywa cykl „napraw, zepsuj, napraw”.
| Faza | Tryb Claude Code | Claude może zmienić | Kończysz fazę, gdy |
|---|---|---|---|
| 1. Przekazanie awarii | claude -p z potokiem, potem claude -c | nic | błąd, wyzwalacz i ostatnie zmiany są w kontekście |
| 2. Śledztwo | tryb planowania (claude --permission-mode plan lub /plan w sesji) | nic | Claude wskazuje jedną przyczynę z plikiem, linią i warunkiem |
| 3. Dowód przyczyny | twój zwykły tryb, tylko pliki testów | nowy test | test nie przechodzi z powodu, który Claude wskazał |
| 4. Poprawka i weryfikacja | twój zwykły tryb | pliki wskazane w diagnozie | nowy test i cały zestaw przechodzą |
-
Przekaż awarię razem z kontekstem
Przekaż wyjście potokiem. Claude Code czyta standardowe wejście razem z promptem, więc błąd nie przechodzi przez schowek:
Okno terminala npm test -- --run tests/services/order.test.ts 2>&1 | \claude -p "This test fails. Read the test and the source it imports. \Name the most likely root cause and the file to open first. Do not edit anything."Następnie uruchom
claude -c, żeby kontynuować tę samą rozmowę interaktywnie, z wyjściem nadal w kontekście. Jeśli wiesz więcej, niż pokazuje log, poświęć 30 sekund na ustrukturyzowane zgłoszenie: -
Prowadź śledztwo w trybie planowania
Uruchom sesję w trybie planowania albo naciskaj
Shift+Tab, aż wskaźnik trybu pokaże tryb planowania. Claude może czytać i przeszukiwać pliki, ale nie może ich edytować:Okno terminala claude --permission-mode planProś o prześledzenie, nie o poprawkę: „Prześledź żądanie od
src/routes/orders.ts, linia 47, przez warstwę serwisów aż do zapytania. Gdzieitemsstaje sięundefined?”. Zanim przyjmiesz odpowiedź, zakwestionuj ją: „Udowodnij to. Pokaż linię, w której powstaje ta wartość, i wyjaśnij, dlaczego dzieje się to tylko u użytkowników z wygasłą sesją”. Dwie wiarygodne przyczyny oznaczają, że wciąż jesteś w fazie 2. -
Udowodnij przyczynę testem, który nie przechodzi
Diagnoza to twierdzenie. Test, który nie przechodzi z podanego powodu, to dowód. Poproś Claude o napisanie testu reprodukującego, uruchomienie go i pokazanie komunikatu błędu. Jeśli test nie przechodzi z innego powodu, diagnoza jest błędna: wróć do kroku 2, zamiast łatać dalej.
-
Popraw, a potem uruchom wszystko
Wyjdź z trybu planowania i daj Claude poprawkę, której nie może rozszerzyć:
Na koniec zadaj jeszcze jedno pytanie: „Search the codebase for other callers that make the same assumption, and list them with file:line. Do not change them.”. Ta lista to następne zgłoszenie, a nie część tego diffu.
Jak przekazać logi i wyjście CI do Claude Code?
Dział zatytułowany „Jak przekazać logi i wyjście CI do Claude Code?”Potok działa wszędzie tam, gdzie błąd już się wypisuje. Filtruj przed przekazaniem: sto istotnych linii pozwala Claude pogrupować błędy według przyczyny, a sto tysięcy surowych linii zostanie tylko streszczone.
Logi produkcyjne:
grep -E "ERROR|WARN" /var/log/app/production.log | tail -100 | \ claude -p "Group these errors by root cause. For each group give the count, \the source file and line, and whether it relates to the payment timeout we are \investigating. Order by count."Nieudany przebieg GitHub Actions (z flagą --log-failed CLI gh wypisuje tylko logi kroków, które zawiodły):
gh run view RUN_ID --log-failed | \ claude -p "Identify the failing test, read its source and the code it tests, \and explain what broke. Check the commits in this run for the change that caused it." \ --allowedTools "Read,Grep,Glob,Bash(git show:*),Bash(git log:*)"Zastąp RUN_ID numerem z gh run list.
Błędy produkcyjne prosto z Sentry. Gdy stack trace żyje w systemie śledzenia błędów, a nie w pliku logu, podłącz serwer MCP Sentry, żeby Claude przeczytał zgłoszenie, jego breadcrumbs i wydanie, w którym błąd się pojawił:
claude mcp add -s project --transport http sentry https://mcp.sentry.dev/mcpclaude mcp login sentryKonfigurację Grafany, Datadoga i PostHoga oraz zakresy tylko do odczytu, które warto nadać, opisuje strona o MCP do obserwowalności.
Jakie prompty w Claude Code działają na powracające typy błędów?
Dział zatytułowany „Jakie prompty w Claude Code działają na powracające typy błędów?”Stack trace z produkcji
Dział zatytułowany „Stack trace z produkcji”Ogólny prompt daje ogólną odpowiedź. Ten zabrania ogólnej poprawki i kończy się testem:
Błędy typów wskazujące niewłaściwy plik
Dział zatytułowany „Błędy typów wskazujące niewłaściwy plik”Wyścigi i sporadyczne awarie
Dział zatytułowany „Wyścigi i sporadyczne awarie”Niejasny prompt daje niejasną teorię. Opisz awarię precyzyjnie i daj Claude listę rzeczy, które faktycznie je powodują:
Przy wyścigach, które opierają się pierwszemu podejściu, zwiększ głębokość rozumowania, zanim zmienisz model. Od v2.1.280 domyślnym modelem Claude Code jest Claude Opus 5.5 i działa on z effort medium; /model pokaże, czego używa twoja instalacja. Wpisz ultrathink w jednym prompcie, żeby pogłębić pojedynczą turę, albo uruchom /effort high (lub wystartuj z claude --effort xhigh) dla całej sesji. Kompromisy opisuje strona o głębokim rozumowaniu, a aktualne ustawienia domyślne i ceny przegląd modeli.
Rosnące zużycie pamięci
Dział zatytułowany „Rosnące zużycie pamięci”Snapshoty sterty to często setki megabajtów JSON-a, a wczytanie jednego zalewa kontekst. Najpierw porównaj je sam: otwórz oba w Chrome DevTools, w panelu Memory przełącz się na widok Comparison i wklej do promptu główne retainery.
Lokalnie przechodzi, w CI nie
Dział zatytułowany „Lokalnie przechodzi, w CI nie”Jak znaleźć commit, który wszystko zepsuł?
Dział zatytułowany „Jak znaleźć commit, który wszystko zepsuł?”Gdy masz dobry commit i test reprodukujący błąd, niech git szuka, a Claude czyta. Uruchom to w terminalu:
git bisect start HEAD GOOD_SHAgit bisect run npx vitest run src/api/search/search.test.tsgit bisect log | claude -p "Read this bisect log. Name the first bad commit, \read its diff, and explain which change breaks /api/search." \ --allowedTools "Read,Grep,Glob,Bash(git show:*),Bash(git log:*)"git bisect resetZastąp GOOD_SHA ostatnim commitem, o którym wiesz, że działał. git bisect run traktuje kod wyjścia 0 jako dobry, a 1–127 (poza 125) jako zły, więc zadziała dowolne polecenie testowe.
Bez znanego dobrego commita zacznij od czasu:
Jak subagenci pomagają przy błędzie, który obejmuje kilka serwisów?
Dział zatytułowany „Jak subagenci pomagają przy błędzie, który obejmuje kilka serwisów?”Gdy błąd przecina kilka części systemu, subagenci badają go równolegle, każdy we własnym kontekście, i zwracają podsumowanie. Główna sesja przechowuje tylko wnioski, więc zostaje w niej miejsce na poprawkę. Claude Code ma do takiego przeszukiwania wbudowanego subagenta Explore; możesz też zdefiniować własnych w .claude/agents/ (zobacz stronę o własnych subagentach).
Żeby ta pętla była dostępna bez proszenia o nią za każdym razem, zainstaluj skill do debugowania. Claude wczyta go, gdy zgłoszenie błędu pasuje do opisu skilla:
npx skills add obra/superpowers --skill systematic-debugging# albonpx skills add mattpocock/skills --skill diagnosing-bugsPrzenośna kopia Superpowers z npx skills add nie ma bootstrapu SessionStart, więc pełna metoda Superpowers nie uruchamia się sama. Jeśli jej potrzebujesz, zainstaluj w sesji Claude Code wtyczkę: /plugin install superpowers@claude-plugins-official.
Sposób sprawdzenia, czy skill rzeczywiście zmienił zachowanie agenta, znajdziesz na stronie o skillach do testowania i debugowania.
Jak analizować awarie CI w trybie headless?
Dział zatytułowany „Jak analizować awarie CI w trybie headless?”claude -p działa bez człowieka przy klawiaturze, a --output-format json opakowuje odpowiedź w JSON, który kolejny krok może opublikować jako komentarz w pull requeście. Przy triage’u zostaw zadanie tylko do odczytu: zezwól wyłącznie na narzędzia do czytania plików i odrzucaj każde pytanie o uprawnienia, zamiast na nie czekać: robi to --permission-mode dontAsk, u każdego dostawcy, także tam, gdzie -p startuje w trybie auto (od v2.1.285).
--bare --setting-sources "" --strict-mcp-config nie pozwala, by hooki, ustawienia i .mcp.json z gałęzi załadowały się obok klucza; --bare uwierzytelnia się wyłącznie przez ANTHROPIC_API_KEY albo apiKeyHelper, nie przez logowanie do subskrypcji. W workflow uruchamiaj testy i wywołanie claude -p w osobnych zadaniach, a test-output.txt przekazuj jako artefakt, tak jak robi to workflow triage’u testów: krok testów może zapisać do GITHUB_ENV albo GITHUB_PATH i w ten sposób sięgnąć do każdego kolejnego kroku tego samego zadania, także tego z kluczem.
Dwie zasady, gdy uruchamiasz ten triage w workflow. Uruchamiaj go tylko na własnych gałęziach (push albo pull_request z tego samego repozytorium), nigdy z sekretami w wyzwalaczu pull_request_target lub workflow_run, który pobiera kod kontrybutora. Poprawki niech nakłada człowiek albo osobne, zrecenzowane zadanie: zadanie triage’u, które może edytować i pushować, zamienia niestabilny test w niezrecenzowany commit. Pełny workflow, razem z blokiem permissions, opisuje strona o CI/CD w Claude Code.
Jak zweryfikować poprawkę z Claude Code bez czytania każdej linii?
Dział zatytułowany „Jak zweryfikować poprawkę z Claude Code bez czytania każdej linii?”Recenzuj dowody, nie diff. Pull request z poprawką błędu jest gotowy, gdy zawiera tych pięć elementów, a recenzent sprawdza je w tej kolejności:
- Opis przyczyny źródłowej: jedno zdanie z plikiem, linią i warunkiem wyzwalającym.
- Czerwony przed zielonym: wynik nowego testu na kodzie bez poprawki (porażka), a potem jego przejście. Sprawdź to sam: odłóż tylko poprawkę przez
git stash push -- <pliki wskazane w diagnozie>, uruchom nowy test i zobacz, że pada, potemgit stash pop. Zwykłegit stashodkłada też test dopisany do istniejącego pliku testowego, więc czerwony przebieg sprawdza tylko stare testy i niczego nie dowodzi. - Cały zestaw testów: linia podsumowania pełnego przebiegu testów po poprawce, nie tylko nowego testu.
- Zakres:
git diff --statpokazuje tylko pliki wskazane w diagnozie i żaden istniejący test się nie zmienił. - Podobne miejsca wywołań: lista innych miejsc z tym samym założeniem, zgłoszona jako dalsza praca.
Programista, który prowadził sesję, zatwierdza punkty 1–3. Recenzent zatwierdza punkty 4 i 5, a cały diff czyta tylko wtedy, gdy punkt 4 pokazuje pliki spoza diagnozy. Te same elementy pasują do zespołowego formatu pakietu dowodów.
Co się psuje przy debugowaniu z Claude Code?
Dział zatytułowany „Co się psuje przy debugowaniu z Claude Code?”Claude naprawia objaw. Dodaje sprawdzenie na null, a błąd przenosi się gdzie indziej. Przyczyna: poproszono go o poprawkę, zanim przyczyna była znana. Wyjście: cofnij edycję przez /rewind (albo dwukrotne Esc), wróć do trybu planowania i użyj promptu ze zgłoszeniem błędu. Powiedz, co ma zostać naprawione: „the value is null because the fetch races the render; fix the race, not the null check”.
Poprawka psuje coś innego. Uruchomiono tylko nowy test. Wyjście: niech „uruchom cały zestaw i wklej podsumowanie” będzie częścią każdego promptu z poprawką, a CI niech uruchamia pełny zestaw jako wymaganą kontrolę.
Nowy test przechodzi przed poprawką. Test nie reprodukuje błędu, więc niczego nie dowodzi. Wyjście: uruchom go na kodzie bez poprawki (git stash push -- <pliki poprawki>, a nie zwykłe git stash, które może odłożyć też test), a jeśli przejdzie, powiedz Claude: „this test passes without the fix, so it does not reproduce the bug; make it fail for the reason you named”.
Claude edytuje test, żeby przeszedł. Osłabiona asercja albo nowe .skip zmienia czerwony na zielony bez naprawienia czegokolwiek. Wyjście: sprawdź w git diff --stat pliki testów, dodaj regułę odmowy z ostrzeżenia powyżej i uruchom oryginalny test z commita, w którym go napisano.
Bisekcja wskazuje zły commit. Niestabilny test oznacza commity jako dobre lub złe losowo. Wyjście: git bisect reset, a potem niech każdy krok uruchamia test kilka razy, tak żeby jedna porażka oznaczała commit jako zły: git bisect run sh -c 'for i in 1 2 3 4 5; do npx vitest run test.ts || exit 1; done'.
Kontekst zapełnia się logami. Długie sesje gromadzą odczyty plików i wyjście testów, aż wczesne ustalenia wypadają z kontekstu. Wyjście: uruchom /compact keep the root-cause statement, the failing test and its output albo zacznij nową sesję tylko z diagnozą i nazwą testu. Przekazywanie przefiltrowanego wyjścia zamiast całych logów zapobiega temu problemowi.