ndk-gdb

ה-NDK כולל סקריפט מעטפת בשם ndk-gdb כדי להתחיל פעילות ניפוי באגים נייטיב בשורת הפקודה. משתמשים שמעדיפים להשתמש ב-GUI לקרוא את התיעוד בנושא ניפוי באגים ב-Android Studio.

הדרישות

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

  • יוצרים את האפליקציה באמצעות הסקריפט ndk-build. הסקריפט ndk-gdb לא תומך בשימוש ב-method הקודם של 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 Maker מגרסה 3.81 ואילך.

שימוש

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

cd $PROJECT
$NDK/ndk-gdb

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

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

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

האינטראקציה עם ndk-gdb מתבצעת באותו אופן כמו עם GNU GDB. לדוגמה, אפשר: כדי להגדיר נקודות עצירה, משתמשים ב-b <location> וב-c (כדי להמשיך) להמשיך בביצוע. אפשר לראות את הרשימה המלאה של הפקודות המדריך ל-GDB. אם אתם מעדיפים להשתמש בכלי לניפוי באגים LLDB, משתמשים בפונקציה --lldb כשמפעילים את הסקריפט ndk-gdb.

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

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

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

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

אפשרויות

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

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

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

אפשרות תיאור>
--lldb

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

--verbose

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

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

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

--launch=<name>

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

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

    --nowait

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

    --tui -t

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

    --gnumake-flag=<flag>

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

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

    תמיכה בשרשור

    אם האפליקציה פועלת בפלטפורמה ישנה יותר מ-Android 2.3 (רמת API 9), ndk-gdb לא יכול לנפות באגים בשרשורים מקוריים בצורה תקינה. הכלי לניפוי באגים יכול לנפות באגים רק בשרשור הראשי, מתעלם מביצוע של שרשורים אחרים.

    אם תציבו נקודת עצירה (breakpoint) בפונקציה שרצה ב-thread שאינו ראשי, התוכנה יוצאת GDB מציג את ההודעה הבאה:

    Program terminated with signal SIGTRAP, Trace/breakpoint trap.
          The program no longer exists.