Felsök ett misslyckat test med en agent
Den här guiden visar hur du får en agent att använda en felsökare på ett fel som print-satser inte förklarar.
Verktyget debug driver en riktig Debug Adapter Protocol-session. En stoppad ram svarar på varje fråga om det ögonblicket på en gång – varje lokal, varje anropare och ett uttryck som utvärderas i rammens eget omfång – medan en print-sats bara svarar på frågan du kom på att ställa innan du körde.
Innan du börjar
Avsnitt med rubriken “Innan du börjar”Verktyget ligger kvar på ytan så att agenten kan fråga varför inget går att använda, i stället för att gissa. En adapter kan faktiskt starta bara när båda dessa stämmer:
- en projektmarkör i utcheckningen, och
- adapterns binärfil går att slå upp.
Be agenten kontrollera:
debug(op: "adapters")Den svarar med vad den hittade, eller förklarar att en adapter behöver båda halvorna.
| Språk | Adapter | Markör | Installation |
|---|---|---|---|
| Dart / Flutter | dart debug_adapter |
pubspec.yaml |
Följer med SDK:n – inget att göra |
| Python | python3 -m debugpy.adapter |
pyproject.toml, setup.py, requirements.txt |
pip install debugpy |
| Rust / C / C++ | lldb-dap |
Cargo.toml, CMakeLists.txt |
Följer med LLVM |
| Go | dlv dap |
go.mod |
go install github.com/go-delve/delve/cmd/dlv@latest |
Sätt brytpunkten först, starta sedan
Avsnitt med rubriken “Sätt brytpunkten först, starta sedan”Ordningen spelar roll och verktyget upprätthåller den: brytpunkter får sättas innan en session finns, eftersom det är sekvensen protokollet kräver.
Be agenten om något i stil med:
Funktionen
computeibin/main.dartreturnerar fel värde. Sätt en brytpunkt på raden som tilldelarproduct, starta den under felsökaren och berätta vadaochbfaktiskt är.
Den kommer att köra ungefär:
debug(op: "breakpoints", file: "bin/main.dart", lines: [7])debug(op: "launch", program: "bin/main.dart")Starten rapporterar var den stoppade:
Launched bin/main.dart on dart (session dart-1). Stopped: breakpoint. Use `stack` to see where.Läs ramen
Avsnitt med rubriken “Läs ramen”debug(op: "stack")→ #1 compute (bin/main.dart:7:3) #2 main (bin/main.dart:2:18)Gå sedan in i den:
debug(op: "scopes", frame_id: 1)→ Locals (reference 12)
debug(op: "variables", reference: 12)→ a (int) = 6 b (int) = 7 product (int) = 42Ett objekt med barn rapporterar [expand: reference N] – men bara när det verkligen finns något bakom, så en expansion som agenten inte kan använda erbjuds aldrig.
För allt som inte syns som en lokal:
debug(op: "evaluate", expression: "config.timeout.inSeconds", frame_id: 1)Stega igenom
Avsnitt med rubriken “Stega igenom”| Vad du vill | Op |
|---|---|
| Kör till nästa stopp | continue |
| Nästa rad, samma ram | step_over |
| In i anropet | step_in |
| Ut till anroparen | step_out |
| Stoppa ett körande program | pause |
Koppla upp mot något som redan kör
Avsnitt med rubriken “Koppla upp mot något som redan kör”För en process som har hakat upp sig i stället för en du startar:
debug(op: "attach", port: 5858)debug(op: "terminate")Avsluta alltid sessionen. En felsökningsadapter äger en stoppad process som håller vad den processen än håller – en port, ett lås, en databasanslutning.
Avgränsad utdata
Avsnitt med rubriken “Avgränsad utdata”En variables-expansion på en djup objektgraf är obegränsad till sin natur – en enda Flutter-widget når hela elementträdet. Barn per omfång begränsas till 50, värden till 400 tecken och stackramar till 30. Ett verktygsresultat som fyller kontextfönstret är ett verktyg som avslutar den körning det hjälpte.
Relaterat
Avsnitt med rubriken “Relaterat”- Kodintelligens – varför en felsökare, en kompilator och en mönstermatcher svarar på olika frågor
- Inbyggda agentverktyg – varje
debug-operation och argument - Felsök en agent – när problemet är agenten, inte koden