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.
Trước khi bắt đầu
Phần tiêu đề “Trước khi bắt đầu”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
computetrongbin/main.darttrả về sai giá trị. Đặt một điểm dừng tại dòng gánproduct, khởi chạy nó dưới trình gỡ lỗi và cho tôi biếtavàbthự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.Đọc khung
Phần tiêu đề “Đọc khung”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) = 42Mộ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)Chạy từng bước
Phần tiêu đề “Chạy từng bước”| Đ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 |
Gắn vào một thứ đang chạy sẵn
Phần tiêu đề “Gắn vào một thứ đang chạy sẵn”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)Kết thúc
Phần tiêu đề “Kết thúc”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.
Đầu ra có giới hạn
Phần tiêu đề “Đầu ra có giới hạn”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ợ.
Liên quan
Phần tiêu đề “Liên quan”- Trí tuệ mã nguồn — vì sao trình gỡ lỗi, trình biên dịch và bộ so khớp trả lời những câu hỏi khác nhau
- Công cụ agent tích hợp — mọi thao tác và tham số của
debug - Chẩn đoán một agent — khi vấn đề nằm ở agent, không phải ở mã