ndk-gdb

‏NDK כולל סקריפט מעטפת בשם ndk-gdb להתחלת סשן ניפוי באגים מקומי בשורת הפקודה (בעבר gdb, עכשיו lldb). משתמשים שמעדיפים להשתמש בממשק משתמש גרפי צריכים לקרוא במקום זאת את המסמכים בנושא ניפוי באגים ב-Android Studio.

דרישות

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

  • פיתוח האפליקציה באמצעות הסקריפט ndk-build. בסקריפט ndk-gdb אין תמיכה בשימוש בשיטה הקודמת make APP=<name> ליצירת גרסאות build.
  • כדי להפעיל ניפוי באגים באפליקציה בקובץ AndroidManifest.xml, צריך לכלול אלמנט <application> שמגדיר את המאפיין android:debuggable לערך true.
  • פיתוח האפליקציה כך שתופעל ב-Android 2.2 (רמת Android API 8) ואילך.
  • ניפוי באגים במכשיר או במהדמה עם Android מגרסה 2.2 ואילך. למטרות ניפוי באגים, רמת ה-API היעד שאתם מגדירים בקובץ AndroidManifest.xml לא חשובה.
  • פיתוח האפליקציה במעטפת Unix. ב-Windows, משתמשים ב-Cygwin או בהטמעה הניסיונית של ndk-gdb-py Python.
  • צריך להשתמש ב-GNU Make בגרסה 3.81 ואילך.

שימוש

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

cd $PROJECT
$NDK/ndk-gdb

כאן, הערך $PROJECT מפנה לתיקיית השורש של הפרויקט, והערך $NDK מפנה לנתיב ההתקנה של NDK.

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

בשלב הבא, ndk-gdb מציג את ההנחיה הרגילה של lldb.

האינטראקציה עם ndk-gdb מתבצעת באותו אופן שבו מתבצעת האינטראקציה עם lldb. אם אתם לא מכירים את LLDB אבל מכירים את GDB, כדאי לעיין במיפוי הפקודות השימושי של GDB ל-LLDB‏ (https://lldb.llvm.org/use/map.html).

הפונקציה ndk-gdb מטפלת בתנאי שגיאה רבים, ומציגה הודעת שגיאה מפורטת אם היא מזהה בעיה. הבדיקות האלה כוללות בדיקה שהתנאים הבאים מתקיימים:

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

כברירת מחדל, הפונקציה ndk-gdb מחפשת תהליך בקשה שכבר פועל, ומציגה הודעת שגיאה אם לא מוצאים כזה. עם זאת, אפשר להשתמש באפשרות --start או --launch=<name> כדי להפעיל את הפעילות באופן אוטומטי לפני סשן ניפוי הבאגים. מידע נוסף זמין בקטע אפשרויות.

אפשרויות

כדי לראות את רשימת האפשרויות המלאה, מקלידים ndk-gdb --help בשורת הפקודה. בטבלה 1 מפורטים כמה מהפונקציות הנפוצות ביותר, עם תיאורים קצרים.

טבלה 1. אפשרויות נפוצות של ndk-gdb והתיאורים שלהן.

הפעלת ndk-gdb עם האפשרות הזו מפעילה את הפעילות הראשונה שאפשר להפעיל שמופיעה במניפסט של האפליקציה. כדי להפעיל את הפעילות הבאה שאפשר להפעיל, מקישים על --launch=<name>. כדי להציג את רשימת הפעילויות שאפשר להפעיל, מריצים את הפקודה --launch-list בשורת הפקודה.

אפשרות Description>
--verbose

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

--force כברירת מחדל, הפקודה ndk-gdb מפסיקה את הפעולה אם היא מזהה שכבר פועל סשן ניפוי באגים מקומי אחר באותו מכשיר. האפשרות הזו מפסיקה את הסשן השני ומחליפת אותו בסשן חדש. חשוב לזכור שהאפשרות הזו לא מפסיקה את האפליקציה בפועל שמתבצע בה ניפוי באגים, וצריך להפסיק אותה בנפרד.
--start

כשמפעילים את ndk-gdb, הוא מנסה כברירת מחדל להתחבר למכונה קיימת שפועלת של האפליקציה במכשיר היעד. אפשר לשנות את התנהגות ברירת המחדל הזו באמצעות --start כדי להפעיל את האפליקציה במכשיר היעד באופן מפורש לפני סשן ניפוי הבאגים.

--launch=<name>

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

--launch-list

האפשרות הזו מאפשרת להדפיס את רשימת כל שמות הפעילויות שניתן להפעיל שמופיעים במניפסט של האפליקציה. ב---start נעשה שימוש בשם הפעילות הראשון.

--project=<path> האפשרות הזו מציינת את ספריית הפרויקט של האפליקציה. האפשרות הזו שימושית אם רוצים להפעיל את הסקריפט בלי לעבור קודם לספריית הפרויקט.
--port=<port>

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

--adb=<file>

האפשרות הזו מציינת את קובץ ההפעלה של הכלי adb. צריך להוסיף אותו רק אם לא הגדרתם את הנתיב כך שיכלול את קובץ ההפעלה הזה.

  • -d
  • -e
  • -s <serial>
  • הדגלים האלה דומים לפקודות adb עם אותם שמות. מגדירים את הדגלים האלה אם יש כמה מכשירים או מכונות וירטואליות שמחוברים למכונה המארחת. המשמעות שלהם היא:

    -d
    חיבור למכשיר פיזי יחיד.
    -e
    התחברות למכשיר אמולטור יחיד.
    -s <serial>
    התחברות למכשיר או לאמולטור ספציפיים. כאן, <serial> הוא שם המכשיר כפי שמופיע בפקודה adb devices.

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

  • --exec=<file>
  • -x <file>
  • האפשרות הזו מורה ל-ndk-gdb להריץ את פקודות האיפוס של מנתח הבאגים שנמצאות ב-<file> אחרי החיבור לתהליך שבו מתבצע ניפוי הבאגים. זו תכונה שימושית אם רוצים לבצע פעולה חוזרת, למשל להגדיר רשימה של נקודות עצירה ואז להמשיך את הביצוע באופן אוטומטי.

    --nowait

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

    --tui -t

    מפעילים את ממשק המשתמש מסוג טקסט אם הוא זמין.

    --gnumake-flag=<flag>

    האפשרות הזו היא דגל (או דגלים) נוסף שצריך להעביר למערכת ndk-build כששולחים אליה שאילתה לגבי פרטי הפרויקט. אפשר להשתמש בכמה מופעים של האפשרות הזו באותה פקודה.

    הערה: שלוש האפשרויות האחרונות בטבלה הזו הן רק לגרסה של ndk-gdb ל-Python.