Sari la conținut

Depanează un test eșuat cu un agent

Acest ghid arată cum să pui un agent să folosească un depanator pentru o defecțiune pe care instrucțiunile de tipărire nu o explică.

Instrumentul debug conduce o sesiune reală Debug Adapter Protocol. Un cadru oprit răspunde deodată la orice întrebare despre acel moment — fiecare variabilă locală, fiecare apelant și o expresie evaluată în scopul propriu al cadrului —, în timp ce o instrucțiune de tipărire răspunde doar la întrebarea la care te-ai gândit înainte de a rula.

Instrumentul rămâne pe suprafață, astfel încât agentul să poată întreba de ce nimic nu este utilizabil, în loc să ghicească. Un adaptor poate porni cu adevărat doar atunci când ambele condiții de mai jos sunt îndeplinite:

  • un marker de proiect în copia locală și
  • binarul adaptorului se rezolvă.

Cere agentului să verifice:

debug(op: "adapters")

Răspunde cu ce a găsit sau explică faptul că un adaptor are nevoie de ambele jumătăți.

Limbaj Adaptor Marker Instalare
Dart / Flutter dart debug_adapter pubspec.yaml Vine cu SDK-ul — nimic de făcut
Python python3 -m debugpy.adapter pyproject.toml, setup.py, requirements.txt pip install debugpy
Rust / C / C++ lldb-dap Cargo.toml, CMakeLists.txt Vine cu LLVM
Go dlv dap go.mod go install github.com/go-delve/delve/cmd/dlv@latest

Setează mai întâi punctul de întrerupere, apoi lansează

Secțiune intitulată „Setează mai întâi punctul de întrerupere, apoi lansează”

Ordinea contează, iar instrumentul o impune: punctele de întrerupere pot fi setate înainte de a exista o sesiune, pentru că aceasta este secvența cerută de protocol.

Cere agentului ceva de genul:

Funcția compute din bin/main.dart returnează o valoare greșită. Setează un punct de întrerupere pe linia care atribuie product, lansează-o sub depanator și spune-mi ce sunt de fapt a și b.

Va rula, aproximativ:

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

Lansarea raportează unde s-a oprit:

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)

Apoi pătrunde în el:

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

Un obiect cu noduri copil raportează [expand: reference N] — dar numai când există cu adevărat ceva în spate, așa că o extindere pe care agentul nu o poate folosi nu este niciodată oferită.

Pentru orice nu este vizibil ca variabilă locală:

debug(op: "evaluate", expression: "config.timeout.inSeconds", frame_id: 1)
Ce vrei să faci Operație
Rulează până la următoarea oprire continue
Linia următoare, în același cadru step_over
Intră în apel step_in
Ieși la apelant step_out
Oprește un program care rulează pause

Pentru un proces blocat, nu pentru unul pe care îl pornești:

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

Încheie întotdeauna sesiunea. Un adaptor de depanare deține un proces oprit care ține tot ce ține procesul respectiv — un port, o blocare, o conexiune la baza de date.

O extindere variables pe un graf de obiecte adânc este nelimitată prin natura ei — un singur widget Flutter ajunge la întregul arbore de elemente. Copiii per scop sunt plafonați la 50, valorile la 400 de caractere, iar cadrele de stivă la 30. Un rezultat de instrument care umple fereastra de context este un instrument care încheie rularea pe care o ajuta.