Gå til innholdet

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.

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

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 compute i bin/main.dart returnerer feil verdi. Sett et bruddpunkt på linjen som tilordner product, start den under feilsøkeren og fortell meg hva a og b faktisk 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.
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) = 42

Et 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)
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

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.

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.