דלגו לתוכן

ניפוי באגים בבדיקה שנכשלה עם סוכן

מדריך זה מראה כיצד לגרום לסוכן להשתמש במנפה בכשל שהצהרות הדפסה אינן מסבירות.

הכלי debug מפעיל סשן Debug Adapter Protocol אמיתי. מסגרת עצורה עונה בבת אחת על כל שאלה על אותו רגע — כל משתנה מקומי, כל קורא, וביטוי שמחושב בתחום של המסגרת עצמה — בעוד הצהרת הדפסה עונה רק על השאלה שחשבתם לשאול לפני ההרצה.

הכלי נשאר על פני המשטח כדי שהסוכן יוכל לשאול מדוע שום דבר אינו שמיש, במקום לנחש. מתאם יכול להתחיל לפעול רק כאשר שני התנאים האלה מתקיימים:

  • סמן שורש ב-checkout, וגם
  • קובץ ההרצה של המתאם נפתר.

בקשו מהסוכן לבדוק:

debug(op: "adapters")

הוא עונה במה שמצא, או מסביר שמתאם זקוק לשני החלקים.

שפה מתאם סמן התקנה
Dart / Flutter dart debug_adapter pubspec.yaml מגיע עם ה-SDK — אין מה לעשות
Python python3 -m debugpy.adapter pyproject.toml, setup.py, requirements.txt pip install debugpy
Rust / C / C++ lldb-dap Cargo.toml, CMakeLists.txt מגיע עם LLVM
Go dlv dap go.mod go install github.com/go-delve/delve/cmd/dlv@latest

הציבו את נקודת העצירה קודם, ואז הפעילו

קטע בשם “הציבו את נקודת העצירה קודם, ואז הפעילו”

הסדר חשוב, והכלי אוכף אותו: אפשר להציב נקודות עצירה לפני שקיים סשן, כי זה הרצף שהפרוטוקול דורש.

בקשו מהסוכן משהו כמו:

הפונקציה compute ב-bin/main.dart מחזירה ערך שגוי. הצב נקודת עצירה על השורה שמשימה ל-product, הפעל אותה תחת המנפה וספר לי מהם בפועל a ו-b.

הוא יריץ בערך:

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

ההפעלה מדווחת היכן היא עצרה:

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)

ואז צעדו לתוכה:

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

אובייקט עם ילדים מדווח [expand: reference N] — אבל רק כשבאמת יש משהו מאחוריו, כך שהרחבה שהסוכן לא יכול להשתמש בה לעולם אינה מוצעת.

לכל דבר שאינו נראה כמשתנה מקומי:

debug(op: "evaluate", expression: "config.timeout.inSeconds", frame_id: 1)
מה אתם רוצים פעולה
לרוץ עד לעצירה הבאה continue
השורה הבאה, באותה מסגרת step_over
להיכנס לתוך הקריאה step_in
לצאת אל הקורא step_out
לעצור תוכנית שרצה pause

התחברות לתהליך שכבר רץ

קטע בשם “התחברות לתהליך שכבר רץ”

עבור תהליך תקוע ולא כזה שאתם מפעילים:

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

תמיד סיימו את הסשן. מתאם ניפוי מחזיק בתהליך עצור שאוחז בכל מה שהתהליך הזה אוחז — פורט, מנעול, חיבור למסד נתונים.

הרחבת variables על גרף אובייקטים עמוק היא בלתי חסומה מטבעה — ווידג’ט Flutter אחד מגיע לכל עץ האלמנטים. מספר הילדים לכל תחום מוגבל ל-50, הערכים ל-400 תווים ומסגרות המחסנית ל-30. תוצאת כלי שממלאת את חלון ההקשר היא כלי שמסיים את הריצה שהוא אמור היה לעזור לה.