İçeriğe geç

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.

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

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.dart içindeki compute fonksiyonu yanlış değer döndürüyor. product değerini atayan satıra bir kesme noktası koy, hata ayıklayıcı altında başlat ve a ile b’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.
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) = 42

Alt öğ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)
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

Başlattığınız bir süreç yerine takılıp kalmış bir süreç için:

debug(op: "attach", port: 5858)
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.

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.