ניפוי באגים בבדיקה שנכשלה עם סוכן
מדריך זה מראה כיצד לגרום לסוכן להשתמש במנפה בכשל שהצהרות הדפסה אינן מסבירות.
הכלי 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. תוצאת כלי שממלאת את חלון ההקשר היא כלי שמסיים את הריצה שהוא אמור היה לעזור לה.
נושאים קשורים
קטע בשם “נושאים קשורים”- אינטליגנציית קוד — למה מנפה, מהדר ומתאים עונים על שאלות שונות
- כלי סוכן מובנים — כל פעולה וארגומנט של
debug - אבחון סוכן — כשהבעיה היא הסוכן, לא הקוד