Feilsøk en mislykket test med en agent
Denne veiledningen viser deg hvordan du får en agent til å bruke en feilsøker på en feil som print-setninger ikke forklarer.
Verktøyet debug driver en ekte Debug Adapter Protocol-økt. En stoppet ramme svarer på alle spørsmål om det øyeblikket på én gang — hver lokal variabel, hver kallende ramme, og et uttrykk evaluert i rammens eget omfang — mens en print-setning bare svarer på spørsmålet du kom på å stille før du kjørte.
Før du begynner
Seksjon med tittelen «Før du begynner»Verktøyet holder seg på overflaten slik at agenten kan spørre hvorfor ingenting er brukbart, i stedet for å gjette. En adapter kan faktisk bare starte når begge disse er oppfylt:
- en prosjektmarkør i utsjekkingen, og
- at adapterens binærfila løses opp.
Be agenten sjekke:
debug(op: "adapters")Den svarer med det den fant, eller forklarer at en adapter trenger begge halvdeler.
| Språk | Adapter | Markør | Installasjon |
|---|---|---|---|
| Dart / Flutter | dart debug_adapter |
pubspec.yaml |
Følger med SDK-en — ingenting å gjøre |
| Python | python3 -m debugpy.adapter |
pyproject.toml, setup.py, requirements.txt |
pip install debugpy |
| Rust / C / C++ | lldb-dap |
Cargo.toml, CMakeLists.txt |
Følger med LLVM |
| Go | dlv dap |
go.mod |
go install github.com/go-delve/delve/cmd/dlv@latest |
Sett bruddpunktet først, og start deretter
Seksjon med tittelen «Sett bruddpunktet først, og start deretter»Rekkefølgen er viktig, og verktøyet håndhever den: bruddpunkter kan settes før en økt finnes, fordi det er sekvensen protokollen krever.
Be agenten om noe slikt:
Funksjonen
computeibin/main.dartreturnerer feil verdi. Sett et bruddpunkt på linjen som tilordnerproduct, start den under feilsøkeren og fortell meg hvaaogbfaktisk er.
Den vil kjøre omtrent:
debug(op: "breakpoints", file: "bin/main.dart", lines: [7])debug(op: "launch", program: "bin/main.dart")Oppstarten rapporterer hvor den stoppet:
Launched bin/main.dart on dart (session dart-1). Stopped: breakpoint. Use `stack` to see where.Les rammen
Seksjon med tittelen «Les rammen»debug(op: "stack")→ #1 compute (bin/main.dart:7:3) #2 main (bin/main.dart:2:18)Gå deretter inn i den:
debug(op: "scopes", frame_id: 1)→ Locals (reference 12)
debug(op: "variables", reference: 12)→ a (int) = 6 b (int) = 7 product (int) = 42Et objekt med barn rapporterer [expand: reference N] — men bare når det virkelig er noe bak det, slik at en utvidelse agenten ikke kan bruke, aldri tilbys.
For noe som ikke er synlig som en lokal variabel:
debug(op: "evaluate", expression: "config.timeout.inSeconds", frame_id: 1)Gå steg for steg
Seksjon med tittelen «Gå steg for steg»| Det du vil | Operasjon |
|---|---|
| Kjør til neste stopp | continue |
| Neste linje, samme ramme | step_over |
| Inn i kallet | step_in |
| Ut til den kallende | step_out |
| Stopp et kjørende program | pause |
Koble til noe som allerede kjører
Seksjon med tittelen «Koble til noe som allerede kjører»For en prosess som har låst seg, i stedet for en du starter selv:
debug(op: "attach", port: 5858)debug(op: "terminate")Avslutt alltid økten. En feilsøkingsadapter eier en stoppet prosess som holder på hva nå enn den prosessen holder — en port, en lås, en databasetilkobling.
Avgrenset utdata
Seksjon med tittelen «Avgrenset utdata»En variables-utvidelse på en dyp objektgraf er ubegrenset av natur — én Flutter-widget når hele elementtreet. Barn per omfang er begrenset til 50, verdier til 400 tegn og stakkrammer til 30. Et verktøyresultat som fyller kontekstvinduet, er et verktøy som avslutter kjøringen det hjalp.
Relatert
Seksjon med tittelen «Relatert»- Kodeintelligens — hvorfor en feilsøker, en kompilator og en matcher svarer på forskjellige spørsmål
- Innebygde agentverktøy — hver
debug-operasjon og hvert argument - Diagnostiser en agent — når problemet er agenten, ikke koden