שימוש בכלי לניפוי באגים

בדף הזה מוסבר איך משתמשים ב-LLDB לפיתוח מערכת הפעלה. לפיתוח אפליקציות, מומלץ לקרוא את המאמר ניפוי באגים באפליקציה, שבו מוסבר איך להשתמש בממשק המשתמש של Android Studio (שמבוסס על LLDB).

אין יותר תמיכה ב-GDB או אפשרות לקבל אותו. אם אתם עוברים מ-GDB ל-LLDB, מומלץ להתחיל בקריאת המדריך ל-LLDB. אם אתם משתמשים מומחים ב-GDB, מפת הפקודות של GDB ל-LLDB תעזור לכם מאוד במהלך המעבר.

דרישות מוקדמות

כדי להשתמש בכלי לניפוי באגים:

  • מגדירים את סביבת ה-build באמצעות הפקודה envsetup.sh הרגילה.
  • מריצים את אותה פקודת lunch שבה השתמשתם בזמן ה-build. חשוב לזכור שהמכשיר צריך להתאים בדיוק למכשיר שבו מבצעים את ניפוי הבאגים. אם פריט הארוחה לא תואם למכשיר המחובר, תופיע הודעת שגיאה בפורמט הבא: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • מחברים את המכשיר למכונה.

למידע נוסף על הגדרת הסביבה, ראו הגדרת הסביבה.

ניפוי באגים בקובץ בינארי

כדי לנפות באגים בקובץ בינארי שיצרתם במחשב, קודם צריך להעתיק את הקובץ הבינארי למכשיר ואז להפעיל את מנתח הבאגים. לדוגמה:

adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

ניפוי באגים באפליקציות או בתהליכים שפועלים

כדי להתחבר לאפליקציה שפועלת או לדימון מקומי, משתמשים ב-lldbclient.py עם PID. לדוגמה, כדי לנפות באגים בתהליך עם PID‏ 1234, מריצים את הפקודה הבאה במארח:

lldbclient.py -p 1234

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

ניפוי באגים בהפעלה של תהליך מקורי

כדי לנפות באגים בתהליך בזמן שהוא מתחיל, משתמשים ב-lldbclient.py עם האפשרות -r. לדוגמה, כדי לנפות באגים ב-ls /bin, מריצים את הפקודה הבאה במארח:

lldbclient.py -r /system/bin/ls /bin

לאחר מכן, מזינים continue בהנחיה של מנתח הבאגים.

ניפוי באגים בהפעלה של האפליקציה

לפעמים רוצים לנפות באגים באפליקציה בזמן שהיא מתחילה לפעול, למשל כשיש קריסה ואתם רוצים לעבור על הקוד כדי לראות מה קרה לפני הקריסה. הוספת קבצים פועלת במקרים מסוימים, אבל במקרים אחרים אי אפשר להוסיף קבצים כי האפליקציה קורסת לפני שאפשר להוסיף אותם. הגישה logwrapper (שמשמשת ל-strace) לא תמיד פועלת, כי יכול להיות שאין לאפליקציה הרשאות לפתוח יציאה, ו-lldbserver יורש את ההגבלה הזו.

כדי לנפות באגים בהפעלה של האפליקציה, משתמשים באפשרויות למפתחים בהגדרות כדי להורות לאפליקציה להמתין לכלי לניפוי באגים ב-Java שיתחבר אליה:

  1. עוברים אל הגדרות > אפשרויות למפתחים > בחירת אפליקציה לניפוי באגים, בוחרים את האפליקציה מהרשימה ולוחצים על המתנה למעבד באגים.
  2. מפעילים את האפליקציה ממרכז האפליקציות או באמצעות שורת הפקודה:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. ממתינים עד שהאפליקציה נטענת ותיפתח תיבת דו-שיח עם ההודעה שהאפליקציה ממתינה לכלי לניפוי באגים.
  4. מחברים את lldbserver/lldbclient באופן רגיל, מגדירים נקודות עצירה וממשיכים בתהליך.

כדי להפעיל את האפליקציה, צריך לצרף לניפוי הבאגים פרוטוקול Java Debug Wire Protocol‏ (JDWP) כמו Java Debugger‏ (jdb):

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

ניפוי באגים באפליקציות או בתהליכים שמתרסקים

אם רוצים ש-debuggerd יפסיק תהליכים שנפלו כדי שתוכלו לצרף מנתח באגים, צריך להגדיר את המאפיין המתאים:

  • אחרי Android 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android מגרסה 11 ומטה
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow וגרסאות ישנות יותר
    adb shell setprop debug.db.uid 999999
    

בסוף הפלט הרגיל של קריסה, debuggerd מספק הוראות להעתקה ולהדבקה ב-logcat שמראה איך לחבר את מנתח הבאגים לתהליך שהוביל לקריסה.

ניפוי באגים באמצעות VS Code

LLDB תומך בניפוי באגים בקוד הפלטפורמה ב-Visual Studio Code. אפשר להשתמש בממשק הקצה של VS Code לניפוי באגים במקום בממשק ה-CLI של LLDB כדי לשלוט בקוד מקומי שפועל במכשירים ולבצע בו ניפוי באגים.

לפני שמשתמשים ב-VS Code לניפוי באגים, צריך להתקין את התוסף CodeLLDB.

כדי לנפות באגים בקוד באמצעות VS Code:

  1. מוודאים שכל הפריטים שנוצרו בתהליך ה-build (כמו סמלים) הנדרשים להרצה של lldbclient.py או lldbclient.py נמצאים.
  2. ב-VS Code, מקישים על Ctrl+Shift+P כדי להריץ פקודה, מחפשים את Debug: Add Configuration… ובוחרים ב-LLDB. הפקודה הזו פותחת קובץ launch.json ומוסיפה אובייקט JSON חדש לרשימה.
  3. מחליפים את הגדרת מנתח הבאגים שנוספה לאחרונה בשתי שורות הערה – // #lldbclient-generated-begin ו-// #lldbclient-generated-end, כך שרשימה ההגדרות תיראה כך:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py משתמש בהערות האלה כדי לזהות איפה לכתוב את קובץ התצורה. אם יש פריטים אחרים ברשימה, מוסיפים את שורות התגובה בסוף, אחרי ההגדרות האחרות.

  4. מריצים את הפקודה הבאה במסוף שבו הרצתם את envsetup.sh ו-lunch:
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py כותב את קובץ התצורה שנוצר ב-launch.json וממשיך לפעול. זו תופעה רגילה. אל תהרגו את התוכנית lldbclient.py. אם תשמיטו את --vscode-launch-file, הסקריפט ידפיס את קטע הקוד של ה-JSON שתצטרכו להעתיק ולהדביק ב-launch.json באופן ידני.

    הדגל -r חייב להיות הדגל האחרון אם הוא מופיע, בגלל האופן שבו הדגלים מנותחים על ידי הכלי.

  5. פותחים את סרגל הצד Run and Debug – ההגדרה החדשה אמורה להופיע ברשימת מנתח הבאגים. מקישים על הפעלת ניפוי באגים (F5). מנתח הבאגים אמור להתחבר תוך 10 עד 30 שניות.

    אם התצורה החדשה לא מופיעה בתצוגה Run and Debug, צריך לטעון מחדש את החלון כדי לרענן את רשימת מנתח הבאגים – מקישים על Ctrl+Shift+P ומקלידים reload window.

  6. כשמסיימים את ניפוי הבאגים, עוברים למסוף שבו פועל lldbclient.py ומקישים על Enter כדי לסיים את התוכנית lldbclient.py. בהפעלות הבאות של הסקריפט, המערכת תיצור את ההגדרות בין התגובות #lldbclient-generated ותחליף את התוכן הישן. אין צורך להסיר אותן באופן ידני.

כדי להוסיף מאפיינים מותאמים אישית להגדרות ההפעלה שנוצרו, אפשר להשתמש בדגל --vscode-launch-props. לדוגמה:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
המאפיינים לדוגמה יגרמו ל-VS Code להריץ משימה בשם Build לפני ניפוי הבאגים, וגם להוסיף שלב חדש של איפוס לצורך ניפוי באגים לשלבים שנוצרו על ידי הסקריפט. סקירה כללית של המאפיינים הזמינים מופיעה במסמכי העזרה של VS Code ובמדריך למשתמש של התוסף CodeLLDB.