Başarısız bir testi ajanla ayıklama
Bu kılavuz, print deyimlerinin açıklamadığı bir başarısızlıkta bir ajanın hata ayıklayıcı kullanmasını nasıl sağlayacağınızı gösterir.
debug aracı gerçek bir Debug Adapter Protocol oturumu yürütür. Durdurulmuş bir çerçeve, o ana ilişkin her soruyu bir anda yanıtlar — her yerel değişkeni, her çağıranı ve çerçevenin kendi kapsamında değerlendirilen bir ifadeyi — oysa bir print deyimi yalnızca çalıştırmadan önce sormayı düşündüğünüz soruyu yanıtlar.
Başlamadan önce
Bölüm başlığı “Başlamadan önce”Araç yüzeyde kalır; böylece ajan tahmin yürütmek yerine neden hiçbir şeyin kullanılamadığını sorabilir. Bir adaptör ancak şu ikisi de geçerli olduğunda gerçekten başlatılabilir:
- checkout’ta bir proje işaretçisi ve
- adaptörün ikili dosyasının çözümlenmesi.
Ajandan şunu denetlemesini isteyin:
debug(op: "adapters")Bulduğunu yanıtlar ya da bir adaptörün her iki yarıma da ihtiyaç duyduğunu açıklar.
| Dil | Adaptör | İşaretçi | Kurulum |
|---|---|---|---|
| Dart / Flutter | dart debug_adapter |
pubspec.yaml |
SDK ile birlikte gelir — yapılacak bir şey yok |
| Python | python3 -m debugpy.adapter |
pyproject.toml, setup.py, requirements.txt |
pip install debugpy |
| Rust / C / C++ | lldb-dap |
Cargo.toml, CMakeLists.txt |
LLVM ile birlikte gelir |
| Go | dlv dap |
go.mod |
go install github.com/go-delve/delve/cmd/dlv@latest |
Önce kesme noktasını koyun, sonra başlatın
Bölüm başlığı “Önce kesme noktasını koyun, sonra başlatın”Sıra önemlidir ve araç bunu zorunlu kılar: kesme noktaları bir oturum var olmadan önce konabilir, çünkü protokolün gerektirdiği sıra budur.
Ajandan şuna benzer bir şey isteyin:
bin/main.dartiçindekicomputefonksiyonu yanlış değer döndürüyor.productdeğerini atayan satıra bir kesme noktası koy, hata ayıklayıcı altında başlat veaileb’nin gerçekte ne olduğunu söyle.
Kabaca şunları çalıştırır:
debug(op: "breakpoints", file: "bin/main.dart", lines: [7])debug(op: "launch", program: "bin/main.dart")Başlatma, nerede durduğunu bildirir:
Launched bin/main.dart on dart (session dart-1). Stopped: breakpoint. Use `stack` to see where.Çerçeveyi okuyun
Bölüm başlığı “Çerçeveyi okuyun”debug(op: "stack")→ #1 compute (bin/main.dart:7:3) #2 main (bin/main.dart:2:18)Ardından içine doğru ilerleyin:
debug(op: "scopes", frame_id: 1)→ Locals (reference 12)
debug(op: "variables", reference: 12)→ a (int) = 6 b (int) = 7 product (int) = 42Alt öğeleri olan bir nesne [expand: reference N] bildirir — ama yalnızca arkasında gerçekten bir şey olduğunda; böylece ajanın kullanamayacağı bir genişletme hiçbir zaman sunulmaz.
Yerel değişken olarak görünmeyen her şey için:
debug(op: "evaluate", expression: "config.timeout.inSeconds", frame_id: 1)Adım adım ilerleyin
Bölüm başlığı “Adım adım ilerleyin”| Amacınız | Op |
|---|---|
| Sonraki durma noktasına kadar çalıştır | continue |
| Sonraki satır, aynı çerçeve | step_over |
| Çağrının içine gir | step_in |
| Çağırana doğru çık | step_out |
| Çalışan bir programı durdur | pause |
Zaten çalışan bir şeye bağlanma
Bölüm başlığı “Zaten çalışan bir şeye bağlanma”Başlattığınız bir süreç yerine takılıp kalmış bir süreç için:
debug(op: "attach", port: 5858)Bitirme
Bölüm başlığı “Bitirme”debug(op: "terminate")Oturumu her zaman sonlandırın. Bir hata ayıklama adaptörü, o sürecin elinde ne varsa — bir port, bir kilit, bir veritabanı bağlantısı — tutan bir durdurulmuş sürece sahiptir.
Sınırlandırılmış çıktı
Bölüm başlığı “Sınırlandırılmış çıktı”Derin bir nesne grafiğinde bir variables genişletmesi doğası gereği sınırsızdır — tek bir Flutter widget’ı tüm öğe ağacına ulaşır. Kapsam başına alt öğe sayısı 50, değerler 400 karakter ve yığın çerçeveleri 30 ile sınırlandırılmıştır. Bağlam penceresini dolduran bir araç sonucu, yardım ettiği çalıştırmayı bitiren bir araçtır.
İlgili
Bölüm başlığı “İlgili”- Kod zekâsı — bir hata ayıklayıcının, bir derleyicinin ve bir eşleştiricinin neden farklı soruları yanıtladığı
- Yerleşik ajan araçları — her
debugişlemi ve argümanı - Bir ajanı tanılamak — sorun kodda değil de ajandaysa