Hoppa till innehåll

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.

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

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 compute i bin/main.dart returnerar fel värde. Sätt en brytpunkt på raden som tilldelar product, starta den under felsökaren och berätta vad a och b faktiskt ä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.
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) = 42

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

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.

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.