ניפוי באגים בקוד של הפלטפורמה

‫Android Studio for Platform‏ (ASfP) משלב ניפוי באגים בפלטפורמה בכמה שפות בכרטיסייה Attach בחלון הכלים Debug:

  • בוחרים באפשרות Run > Attach to Android Process (Control+Alt+A) כדי לצרף את Java debugger,‏ Native debugger (חבילת LLDB) או את שניהם לכל אפליקציה או תהליך מערכת שפועלים במכשיר פיזי או במכשיר וירטואלי של Cuttlefish.
  • לפני שמצרפים ספרייה משותפת, צריך לבדוק כל ספרייה משותפת שנטענה (.so) ואת מזהה הבנייה שלה בפורמט ELF עם שמונה תווים בחלונית Libraries. סמני וי מאמתים את התאמת סמלי הניפוי באגים המקומיים בקטע out/target/product/<device>/symbols.
  • אפשר לנהל את הדרישות המוקדמות של המכשיר מסרגל הכלים: מסננים באמצעות הצגת תהליכי המערכת, לוחצים על מכשיר עם הרשאות בסיס כדי להפעיל את adb root (מוצג למכשיר יש הרשאות בסיס כשהאפשרות פעילה) ולוחצים על הפעלת JDWP כדי להפעיל את JDWP בגרסאות build של userdebug.
  • אפשר להגדיר נקודות עצירה מותנות ונקודות עצירה של חריגים, להציג ערכי משתנים מוטבעים בעורך, להשתמש בהורדת פריימים ובכניסה חכמה, ולבדוק סוגים מובנים של C++‎ ו-Rust בזמן ריצה.

לפני שמשתמשים בכלי לניפוי באגים, צריך ליצור את יעד lunch כדי שמדד הסמלים המקומי out/target/product/<device>/symbols/.build-id יתקיים, ולהפעיל או להציג תמונה תואמת של המכשיר.

ניפוי באגים ב-Java ובנייטיב

כדי לנפות באגים באפליקציית Java או Kotlin, באפליקציית מערכת (כמו com.android.messaging, Settings או SystemUI) או בתהליך שקורא לקוד JNI ו-C++‎ או Rust, מבצעים את השלבים הבאים:

  1. מגדירים נקודות עצירה בקובצי המקור של Java,‏ Kotlin,‏ C,‏ C++ או Rust.
  2. בוחרים באפשרות הפעלה > צירוף לתהליך Android (Control+Alt+A). ‫ASfP פותח כרטיסייה מוצמדת של צירוף בתוך חלון הכלי ניפוי באגים.
  3. בוחרים את מכשיר היעד מהתפריט הנפתח של המכשירים. אם JDWP לא מופעל בגרסת userdebug, לוחצים על Enable JDWP (הפעלת JDWP) – ASfP מגדיר את persist.debug.dalvik.vm.jdwp.enabled=1 ומפעיל מחדש את המכשיר. כשהלחצן פעיל, מוצג בו הכיתוב JDWP enabled (הפעלת JDWP), ובלחיצה ימנית עליו מוצגת הפעולה Disable JDWP (השבתת JDWP).
  4. בוחרים את תהליך היעד מהטבלה (תהליכי Java ו-ART מוצגים עם סמל של ספל קפה).
  5. בתחתית הכרטיסייה Attach, בוחרים באפשרות Java debugger,‏ Native debugger או בשתיהן. אם בוחרים את שתי האפשרויות, נפתחות שתי כרטיסיות מקושרות בחלון הכלים Debug (ניפוי באגים): <process> (<pid>) ל-LLDB המובנה ו-<process> (<pid>)-jdwp ל-Java. מחזור החיים שלהם קשור זה לזה, כך שהפסקת אחד מהסשנים תגרום להפסקת שניהם.
  6. לוחצים על Attach (צירוף) ומשתמשים באפליקציה במכשיר כדי להגיע לנקודות העצירה.

כרטיסיות כפולות של ניפוי באגים ב-Java ובנייטיב שמקושרות לצד הכרטיסייה Attach (צירוף)

ניפוי באגים בתהליך המערכת (C ו-C++) ואימות סמלים

כדי לנפות באגים בשדים של המערכת, ב-HAL או בשירותי המערכת (כמו android.hardware.bluetooth-service.cuttlefish,‏ surfaceflinger או audioserver), מבצעים את השלבים הבאים:

  1. פותחים את Run > Attach to Android Process (הפעלה > צירוף לתהליך Android) ‏(Control+Alt+A). אם בסרגל הכלים מופיעה האפשרות Root Device, לוחצים עליה כדי להפעיל את ASfP adb root ולהציג את ההודעה Device is rooted.
  2. בוחרים באפשרות הצגת תהליכי מערכת בסרגל הכלים העליון ומסננים את תהליך היעד.
  3. אימות סמלי ניפוי הבאגים המקומיים בחלונית Libraries: בחירת תהליך מאכלסת את הטבלה Libraries בכל ספרייה משותפת של ELF ‏ (.so) שנטענה בתהליך, ובשמונת התווים ההקסדצימליים הראשונים של מזהה הבנייה של ה-ELF. ‫ASfP משווה כל מזהה Build ל-out/target/product/<device>/symbols (נדרש symbols/.build-id כדי לפתור ספריות בתוך קובצי APEX):
    • סמל וי מוצג בספריות מאומתות. מציבים את הסמן על שורה כלשהי שנפתרה כדי לראות תצוגה מקדימה של הנתיב המלא של סמל המטבע המקומי .debug.
    • ספריות לא פתורות ללא סמלים מקומיים תואמים מציגות סמל אזהרה.
  4. זיהוי תהליכים שאינם Java: כשבוחרים תהליך C++‎ או Rust (מסומן בסמל משושה C), ASfP מסתיר את Java debugger ומציג את ההודעה Java debugging unavailable, not a Java process. תוך שמירה על הסימון של Native debugger.
  5. מגדירים נקודות עצירה בקובצי המקור של C,‏ C++‎ או Rust, לוחצים על Attach ומפעילים את נתיב הקוד במכשיר.

צילום מסך של הכרטיסייה Attach (צירוף) שבו מוצגת הטבלה Libraries (ספריות), מזהי ה-Build של ELF וסימני ביקורת של סמלים מקומיים

ניפוי באגים בקוד Rust

ב-ASfP אפשר לנפות באגים בקוד של פלטפורמת Rust באמצעות אותו מנפה באגים מובנה של LLDB שמשמש ל-C ול-C++. לא נדרש מתאם חיצוני או הגדרה ידנית של שרת: ASfP משתמש ב-lldb-dap משרשרת הכלים שכלולה בחבילה, וטוען באופן אוטומטי את מדפיסי ה-Rust היפים מהקובץ AOSP prebuilts, כך שסוגים סטנדרטיים כמו String,‏ Vec,‏ HashMap ו-Option מציגים ערכים מובנים בחלונית Variables.

צירוף לתהליך Rust שפועל במכשיר

פועלים לפי השלבים במאמר בנושא ניפוי באגים בתהליך המערכת (C ו-C++): פותחים את Run > Attach to Android Process, מוודאים שמופיע סימן וי ליד Device is rooted וליד הסמלים המקומיים בחלונית Libraries, משאירים את האפשרות Native debugger מסומנת ולוחצים על Attach. מסגרות סטאק ב-Rust וב-C או C++‎ מופיעות יחד באותו סשן ניפוי באגים.

ניפוי באגים במודול rust_test או rust_test_host

  1. פותחים את קובץ Android.bp שבו מוגדר rust_test או rust_test_host יעד, ולוחצים על סמל ההפעלה בשוליים לצד סוג המודול.
  2. בוחרים באפשרות Debug '<ModuleName>'. ASfP יוצר את היעד, מפעיל את קובץ הבדיקה הבינארי ב-LLDB במחשב המארח או במכשיר המחובר, ומשהה את הפעולה בנקודות העצירה של Rust.
  3. כדי לנפות באגים בפונקציית בדיקה יחידה או להתאים אישית את פקודות ההפעלה של LLDB, פותחים את הפעלה > עריכת הגדרות, בוחרים את ההגדרה שנוצרה Soong Test ומגדירים את Method או מרחיבים את האפשרויות של Debugger. מידע נוסף על אפשרויות ההגדרה של Soong Test זמין במאמר בדיקת קוד של פלטפורמת בדיקה באמצעות atest.

ניפוי באגים בקוד של פלטפורמת Rust באמצעות כלי להמחשת משתנים מובְנים ב-ASfP