Ga naar inhoud

Een falende test debuggen met een agent

Deze gids laat zien hoe je een agent een debugger laat gebruiken voor een fout die printinstructies niet verklaren.

De tool debug stuurt een echte Debug Adapter Protocol-sessie aan. Een gestopt frame beantwoordt elke vraag over dat moment in één keer — elke local, elke aanroeper, en een expressie die in de eigen scope van het frame wordt geëvalueerd — waar een printinstructie alleen de vraag beantwoordt die je vóór het draaien bedacht had.

De tool blijft aan het oppervlak, zodat de agent kan vragen waarom niets bruikbaar is in plaats van te gokken. Een adapter kan pas echt starten wanneer aan beide voorwaarden is voldaan:

  • een projectmarker in de checkout, en
  • de binary van de adapter die te vinden is.

Vraag de agent om dit te controleren:

debug(op: "adapters")

Hij antwoordt met wat hij heeft gevonden, of legt uit dat een adapter beide helften nodig heeft.

Taal Adapter Marker Installatie
Dart / Flutter dart debug_adapter pubspec.yaml Zit bij de SDK — niets te doen
Python python3 -m debugpy.adapter pyproject.toml, setup.py, requirements.txt pip install debugpy
Rust / C / C++ lldb-dap Cargo.toml, CMakeLists.txt Zit bij LLVM
Go dlv dap go.mod go install github.com/go-delve/delve/cmd/dlv@latest

De volgorde is belangrijk en de tool dwingt die af: breakpoints mogen voordat er een sessie bestaat worden ingesteld, omdat het protocol die volgorde vereist.

Vraag de agent zoiets als:

De functie compute in bin/main.dart geeft de verkeerde waarde terug. Zet een breakpoint op de regel die product toewijst, start het onder de debugger en vertel me wat a en b werkelijk zijn.

Hij voert ongeveer dit uit:

debug(op: "breakpoints", file: "bin/main.dart", lines: [7])
debug(op: "launch", program: "bin/main.dart")

De start meldt waar hij is gestopt:

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)

Ga er dan in:

debug(op: "scopes", frame_id: 1)
→ Locals (reference 12)
debug(op: "variables", reference: 12)
→ a (int) = 6
b (int) = 7
product (int) = 42

Een object met onderliggende waarden meldt [expand: reference N] — maar alleen wanneer er werkelijk iets achter zit, zodat een uitklapping die de agent niet kan gebruiken nooit wordt aangeboden.

Voor alles wat niet als local zichtbaar is:

debug(op: "evaluate", expression: "config.timeout.inSeconds", frame_id: 1)
Wat je wilt Op
Doorlopen naar het volgende stopmoment continue
Volgende regel, hetzelfde frame step_over
De aanroep in step_in
Uit naar de aanroeper step_out
Een draaiend programma stoppen pause

Voor een vastgelopen proces in plaats van een proces dat je zelf start:

debug(op: "attach", port: 5858)
debug(op: "terminate")

Beëindig de sessie altijd. Een debugadapter bezit een gestopt proces dat vasthoudt wat dat proces ook vasthoudt — een poort, een lock, een databaseverbinding.

Een variables-uitklapping op een diepe objectgraaf is van nature onbegrensd — één Flutter-widget reikt tot de hele elementenboom. Het aantal onderliggende waarden per scope is gemaximeerd op 50, waarden op 400 tekens en stackframes op 30. Een toolresultaat dat het contextvenster vult, is een tool die de run beëindigt die hij aan het helpen was.