Bỏ qua để đến nội dung

Gỡ lỗi bài kiểm thử thất bại bằng agent

Hướng dẫn này chỉ cho bạn cách để một agent dùng trình gỡ lỗi cho một lỗi mà các câu lệnh in không giải thích được.

Công cụ debug điều khiển một phiên Debug Adapter Protocol thật. Một khung đang dừng trả lời mọi câu hỏi về khoảnh khắc đó cùng lúc — mọi biến cục bộ, mọi nơi gọi, và một biểu thức được tính trong chính phạm vi của khung — trong khi một câu lệnh in chỉ trả lời câu hỏi bạn đã nghĩ ra trước khi chạy.

Công cụ luôn hiện diện trên bề mặt để agent có thể hỏi vì sao không có gì dùng được, thay vì đoán mò. Một adapter chỉ thực sự khởi động được khi cả hai điều sau đều đúng:

  • có một dấu hiệu dự án trong bản checkout, và
  • tệp nhị phân của adapter phân giải được.

Hãy yêu cầu agent kiểm tra:

debug(op: "adapters")

Nó trả lời bằng những gì tìm thấy, hoặc giải thích rằng một adapter cần cả hai nửa.

Ngôn ngữ Adapter Dấu hiệu Cài đặt
Dart / Flutter dart debug_adapter pubspec.yaml Đi kèm SDK — không cần làm gì
Python python3 -m debugpy.adapter pyproject.toml, setup.py, requirements.txt pip install debugpy
Rust / C / C++ lldb-dap Cargo.toml, CMakeLists.txt Đi kèm LLVM
Go dlv dap go.mod go install github.com/go-delve/delve/cmd/dlv@latest

Đặt điểm dừng trước, rồi khởi chạy

Phần tiêu đề “Đặt điểm dừng trước, rồi khởi chạy”

Thứ tự rất quan trọng và công cụ bắt buộc phải theo: điểm dừng có thể được đặt trước khi một phiên tồn tại, vì đó là trình tự mà giao thức yêu cầu.

Hãy yêu cầu agent làm việc đại loại như sau:

Hàm compute trong bin/main.dart trả về sai giá trị. Đặt một điểm dừng tại dòng gán product, khởi chạy nó dưới trình gỡ lỗi và cho tôi biết a và b thực sự là gì.

Nó sẽ chạy đại khái:

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

Lệnh launch báo cáo nơi nó dừng lại:

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)

Sau đó đi vào bên trong khung:

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

Một đối tượng có các đối tượng con sẽ báo [expand: reference N] — nhưng chỉ khi thật sự có thứ gì đó đằng sau nó, nên một phần mở rộng mà agent không dùng được sẽ không bao giờ được đưa ra.

Với bất cứ thứ gì không hiển thị như một biến cục bộ:

debug(op: "evaluate", expression: "config.timeout.inSeconds", frame_id: 1)
Điều bạn muốn Op
Chạy tới điểm dừng kế tiếp continue
Dòng kế tiếp, cùng khung step_over
Đi vào lời gọi step_in
Đi ra nơi gọi step_out
Dừng một chương trình đang chạy pause

Dành cho một tiến trình bị kẹt thay vì một tiến trình bạn đang khởi chạy:

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

Luôn kết thúc phiên. Một bộ điều hợp gỡ lỗi sở hữu một tiến trình bị dừng đang giữ bất cứ thứ gì tiến trình đó giữ — một cổng, một khóa, một kết nối cơ sở dữ liệu.

Một phần mở rộng variables trên một đồ thị đối tượng sâu vốn không có giới hạn tự nhiên — một widget Flutter chạm tới toàn bộ cây phần tử. Số đối tượng con mỗi phạm vi bị giới hạn ở 50, giá trị ở 400 ký tự và khung ngăn xếp ở 30. Một kết quả công cụ lấp đầy cửa sổ ngữ cảnh chính là công cụ kết thúc lượt chạy mà nó đang hỗ trợ.