כלי לחיטוי של HWAddress

Android NDK תומך בכלי לחיטוי של HWAddress, שנקרא גם HWASan, בהתחלה עם NDK r21 ו-Android 10 (רמת API 29). HWASan זמין רק בגרסת 64 ביט זרוע מכשירים.

HWASan הוא כלי לזיהוי שגיאות זיכרון שדומה ל-ASan. בהשוואה לגרסה הקלאסית אסן, HWASan כולל:

  • תקורה דומה של המעבד (CPU) (כ-2x)
  • תקורה של גודל קוד דומה (40-50%)
  • תקורה קטנה בהרבה של RAM (10%-35%)

HWASan מזהה את אותה קבוצת באגים כמו ASan:

  • גלישה במאגר נתונים זמני של ערימה או ערימה
  • שימוש בערימה אחרי בחינם
  • שימוש במקבץ מחוץ להיקף
  • כפול חינם או בחינם

בנוסף, HWASan מזהה גם:

  • שימוש בערימה אחרי החזרה

אפליקציה לדוגמה

אפליקציה לדוגמה מראים איך להגדיר וריאנט build Hwasan.

Build

כדי ליצור את קוד ה-JNI המקורי של האפליקציה באמצעות HWAddress Sanitizer, הבאים:

ndk-build

בקובץ Application.mk:

APP_STL := c++_shared # Or system, or none, but not c++_static.
APP_CFLAGS := -fsanitize=hwaddress -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=hwaddress

CMake

בקובץ build.gradle של המודול:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                # Can also use system or none as ANDROID_STL, but not c++_static.
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }
}

לכל יעד בקובץ CMakeLists.txt:

target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)

עם NDK מגרסה 27 ואילך, אפשר גם להשתמש בפריטים הבאים בbuild.gradle ולא חייבים לשנות את CMakeLists.txt:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_SANITIZE=hwaddress"
            }
        }
    }
}

היא לא תעבוד כשמשתמשים ב-ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false.

Android מגרסה 14 ואילך: מוסיפים wrap.sh

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

פועלים לפי ההוראות כדי לארוז סקריפט wrap.sh כדי להוסיף את סקריפט wrap.sh הבא עבור arm64-v8a.

#!/system/bin/sh
LD_HWASAN=1 exec "$@"

הרצה

אם במכשיר פועלת גרסת Android ישנה יותר מ-14, או שלא הוספת wrap.sh פועלים לפי הוראות ההגדרה לפני שמפעילים את האפליקציה.

מפעילים את האפליקציה כרגיל. כשמזוהה שגיאת זיכרון, אפליקציה קורסת עם SIGABRT ומדפיסים הודעה מפורטת ל-Logcat. עותק של ההודעה יכול נמצא בקובץ ב-/data/tombstones, ונראה כך:

ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
    #0 0x7b24d90a08  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
    #1 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)
    #2 0x7b8f1db364  (/apex/com.android.art/lib64/libart.so+0x18f364)
    #3 0x7b8f2ad8d4  (/apex/com.android.art/lib64/libart.so+0x2618d4)

0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
    #0 0x7b92a322bc  (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
    #1 0x7b24d909e0  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
    #2 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)

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

מידע נוסף על שגיאת HWASan זמין במאמר הסבר על דוחות HWASan הודעות.

פיתוח קובצי הפעלה של שורת פקודה

אפשר ליצור ולהריץ קובצי הפעלה עם אינסטרומנטציה של HWASan ב-Android 14. חדש יותר. אפשר להשתמש באותן ההגדרות שמתוארות ב-Build בשביל ndk-build או CMake לקובצי ההפעלה. דחיפת קובצי ההפעלה למכשיר עם Android מגרסה 14 ואילך ולהריץ אותה כרגיל באמצעות המעטפת.

אם אתם משתמשים ב-libc++, יש לוודא שאתם משתמשים ב-STL המשותף ולדחוף אותו אל במכשיר ולהגדיר את LD_LIBRARY_PATH לספרייה שמכילה אותו כאשר להריץ את הקוד הבינארי.

אם אתם לא משתמשים ב-Gradle, כדאי לעיין במסמכי התיעוד של NDK כדי ללמוד איך ליצור מהם שורת הפקודה CMake ndk-build.

Android מגרסה 13 ומטה: הגדרה

אם במכשיר שלכם פועלת מערכת Android מגרסה 14 ואילך, אפשר לדלג על השלב הזה ולפעול לפי הוראות לשימוש ב-wrap.sh המפורטות בקטע Build שבהמשך אפשר גם לעקוב אחרי הקטע הזה ולדלג על ההוראות לשימוש wrap.sh למטה.

לפני Android 14, אפליקציות HWASan זקוקות לגרסת HWASan של Android כדי לפעול. ניתן לבצע Flash תמונות HWASan מוכנות מראש למכשירי Pixel נתמכים. גרסאות ה-build זמינה בכתובת ci.android.com, שם ניתן ללחוץ על הריבוע של ה-build המדויק שברצונך לקבל קישור ל-Flash Build. כדי לעשות זאת, יש לדעת שם הקוד של הטלפון.

ביצוע Flash של גרסת build של מכשיר

יכול להיות שבמקום זאת יהיה קל יותר לעבור ישירות אל Flash.android.com, כי שם התהליך מתחיל בזיהוי המכשיר ומראה רק גרסאות build שאפשר להשתמש בהן. התמונות הבאות ממחישות את תהליך ההגדרה בכלי הזה.

הפעלת מצב פיתוח במכשיר וחיבור שלו למחשב באמצעות כבל USB. לוחצים על הוספת מכשיר חדש, בוחרים את המכשיר הרצוי מתיבת הדו-שיח. לוחצים על Connect.

זיהוי מכשיר להבהוב בחירת המכשיר שאליו רוצים להתחבר

אחרי שמחברים את המכשיר, צריך ללחוץ עליו כדי להגדיר את ה-build. בתיבה בחירת מזהה build, מסמנים את התיבה aosp-master-with-phones-throttled הסתעפות כדי לבחור באופן אוטומטי את התמונה הנכונה עבור המכשיר מחובר.

בחירת המכשיר להבהוב אישור אפשרויות הפלאש והבהוב המכשיר

לוחצים על התקנה כדי להבהב את המכשיר.

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