معقّم HWAddress

يتيح Android NDK استخدام HWAddress Sanitizer، المعروف أيضًا باسم HWASan، بدءًا من IDE r21 وAndroid 10 (المستوى 29 لواجهة برمجة التطبيقات). لا يتوفّر HWASan إلا على أجهزة Arm‏ 64 بت.

‫HWASan هي أداة لرصد أخطاء الذاكرة مشابهة لأداة ASan. مقارنةً بإصدار ASan الكلاسيكي، يتضمن HWASan ما يلي:

  • استهلاك وحدة المعالجة المركزية (CPU) بشكل مماثل (مرتين تقريبًا)
  • حجم الرمز البرمجي الإضافي المشابه (من %40 إلى %50)
  • استخدام أقل بكثير لذاكرة الوصول العشوائي (من %10 إلى %35)

يرصد HWASan المجموعة نفسها من الأخطاء التي يرصدها ASan:

  • فائض أو نقص في سعة المخزن المؤقت للرصِيد والمساحة
  • استخدام الذاكرة لأخذ لقطات لعناصر متعدّدة بعد تحريرها
  • استخدام الحزمة خارج النطاق
  • مزدوجة مجانية أو مجانية بلا قيود

بالإضافة إلى ذلك، يرصد HWASan أيضًا ما يلي:

  • استخدام الحزمة بعد الإرجاع

نموذج التطبيق

يعرض نموذج التطبيق كيفية ضبط صيغة إصدار لتطبيق hwasan.

إنشاء

لإنشاء رمز تطبيقك الأصلي (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

إذا كنت تستخدم الإصدار 14 من نظام التشغيل Android أو إصدارًا أحدث، يمكنك استخدام النص البرمجي wrap.sh لتشغيل تطبيقك القابل لتصحيح الأخطاء على أي جهاز يعمل بنظام التشغيل Android. يمكنك تخطّي هذه الخطوة إذا اخترت اتّباع الخطوات описанَة في تعليمات الإعداد.

اتّبِع التعليمات المتعلقة بتجميع نص wrap.sh البرمجي لإضافة النص البرمجي التالي wrap.sh لـ arm64-v8a.

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

تشغيل

إذا كنت تستخدم إصدارًا أقدم من Android 14 أو لم تضِف ملف wrap.sh script، اتّبِع تعليمات الإعداد قبل تشغيل تطبيقك.

شغِّل التطبيق كالمعتاد. عند رصد خطأ في الذاكرة، يتعطل التطبيق باستخدام رمز الخطأ 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)

قد تتبع الرسالة معلومات إضافية لتحديد الأخطاء وإصلاحها، بما في ذلك قائمة المواضيع النشطة في التطبيق وعلامات عمليات تخصيص الذاكرة المجاورة وقيم سجلّ وحدة المعالجة المركزية.

اطّلِع على التعرّف على تقارير HWASan للحصول على مزيد من المعلومات عن رسائل خطأ HWASan.

إنشاء ملفات تنفيذية لسطر الأوامر

يمكنك إنشاء ملفات تنفيذية تم اختبارها باستخدام HWASan وتشغيلها على الإصدار 14 من Android والإصدارات الأحدث. يمكنك استخدام الإعدادات نفسها الموضّحة في الإنشاء لتطبيق devtools-build أو CMake لملفاتك التنفيذية. أرسِل الملفات القابلة للتنفيذ إلى جهاز يعمل بالإصدار 14 من نظام التشغيل Android أو إصدار أحدث وشغِّلها كالمعتاد باستخدام واجهة سطر الأوامر.

إذا كنت تستخدم libc++، تأكَّد من استخدام مكتبة STL المشتركة وادفعها إلى الجهاز واضبط LD_LIBRARY_PATH على الدليل الذي يحتوي عليها عند تشغيل الملف الثنائي.

إذا كنت لا تستخدم Gradle، اطّلِع على مستندات NDK للتعرّف على كيفية الإنشاء من سطر الأوامر باستخدام CMake و ndk-build.

الإصدار 13 من Android أو الإصدارات الأقدم: الإعداد

إذا كان جهازك يعمل بالإصدار 14 من نظام التشغيل Android أو إصدار أحدث، يمكنك تخطّي هذه الخطوة واتّباع تعليمات استخدام wrap.sh في قسم الإنشاء. يمكنك أيضًا اختيار اتّباع هذا القسم وتخطّي تعليمات استخدام wrap.sh.

قبل الإصدار 14 من Android، كانت تطبيقات HWASan تتطلّب إصدار HWASan من Android لتشغيلها. يمكنك تثبيت صور HWASan المُعدّة مسبقًا على أجهزة Pixel المتوافقة. تتوفّر الإصدارات على ci.android.com، حيث يمكنك النقر على المربّع للإصدار المحدد الذي تريد الحصول على رابط Flash Build له. يتطلّب ذلك معرفة الاسم الرمزي لهاتفك.

فلاش إصدار جهاز

قد يكون من الأسهل الانتقال مباشرةً إلى flash.android.com لأنّه يبدأ الخطوات هناك من خلال رصد جهازك وعرض الإصدارات التي يمكنك استخدامها فقط. توضِّح الصور التالية خطوات الإعداد في هذه الأداة.

فعِّل وضع المطوّر على جهازك ووصِّله بالكمبيوتر باستخدام كابل USB. انقر على إضافة جهاز جديد، واختَر جهازك من مربّع الحوار، ثم انقر على ربط.

رصد جهاز لفلاشه اختيار الجهاز المطلوب الاتصال به

بعد توصيل جهازك، انقر عليه لضبط الإصدار. في المربّع اختيار رقم تعريف الإصدار، اختَر الفرع aosp-master-with-phones-throttled لاختيار الصورة الصحيحة تلقائيًا للجهاز الذي تم توصيله.

اختيار الجهاز المطلوب فلاشه تأكيد خيارات الفلاش وفلاش الجهاز

انقر على تثبيت لفلاش جهازك.

يمكنك الاطّلاع على مزيد من التفاصيل حول الإعدادات اللازمة في ملف مستندات أداة فلاش Android. بدلاً من ذلك، يمكنك الاطّلاع على مستندات AOSP للحصول على تعليمات لإنشاء صورة HWASan من المصدر.