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

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

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

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

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

  • מגדירים את סביבת ה-build באמצעות הפקודה הרגילה envsetup.sh.
  • מריצים את אותה פקודת lunch ששימשה לפיתוח. חשוב לשים לב שפריט הארוחת צהריים צריך להתאים במדויק למכשיר שממנו מתבצע ניפוי הבאגים. אם הפריט לארוחת צהריים לא תואם למכשיר המצורף, תופיע הודעת שגיאה בטופס: 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

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

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

lldbclient.py -p 1234

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

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

כדי לנפות באגים בתהליך כשהוא מתחיל, צריך להשתמש ב-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. מחברים lldbclient/lldbserver כרגיל, נקודות עצירה (breakpoint), ואז ממשיכים בתהליך.

כדי לאפשר לאפליקציה לפעול, יש לצרף פרוטוקול 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

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

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

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

  1. מוודאים שכל ארטיפקטים (כמו סמלים) של build שנדרשים כדי לפעול lldbclient.py או lldbclient.py קיימים.
  2. ב-VS Code, מקישים על Ctrl+Shift+P כדי להריץ פקודה, מחפשים את Debug: מוסיפים הגדרה... ואז בוחרים 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 שניות.

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