يتوافق Android NDK مع HWAddress Sanitizer، المعروف أيضًا باسم HWASan، بدءًا من الإصدار 21 من NDK وAndroid 10 (المستوى 29 من واجهة برمجة التطبيقات). لا يتوفّر HWASan إلا على أجهزة Arm ذات 64 بت.
HWASan هي أداة لرصد أخطاء الذاكرة تشبه ASan. مقارنةً بـ ASan الكلاسيكية، تتضمّن HWASan ما يلي:
- تكلفة مماثلة لوحدة المعالجة المركزية (CPU) (أعلى مرتين تقريبًا)
- زيادة حجم الرمز البرمجي المشابه (من %40 إلى %50)
- تقليل كبير في استخدام ذاكرة الوصول العشوائي (من %10 إلى %35)
يرصد HWASan مجموعة الأخطاء نفسها التي يرصدها ASan:
- فائض سعة المخزن المؤقت أو نقصها في حزمة البيانات أو الذاكرة المخصّصة
- استخدام الذاكرة بعد تحريرها
- استخدام الحزمة خارج النطاق
- Double free أو wild free
بالإضافة إلى ذلك، يرصد 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 (Gradle Groovy)
في ملف 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
.
CMake (Gradle Kotlin)
في ملف 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، اتّبِع تعليمات الإعداد قبل تشغيل تطبيقك.
شغِّل التطبيق كالمعتاد. عند رصد خطأ في الذاكرة، يتعطّل التطبيق مع ظهور 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 والإصدارات الأحدث. يمكنك استخدام الإعدادات نفسها الموضّحة في إنشاء مع ndk-build أو CMake للملفات التنفيذية. أرسِل الملفات التنفيذية إلى جهاز يعمل بالإصدار 14 من نظام التشغيل Android أو إصدار أحدث، وشغِّلها كالمعتاد باستخدام واجهة الأوامر.
إذا كنت تستخدم libc++، تأكَّد من استخدام STL المشترَكة ونقلها إلى الجهاز وضبط LD_LIBRARY_PATH
على الدليل الذي يحتوي عليها عند تشغيل الرمز الثنائي.
إذا كنت لا تستخدم Gradle، راجِع مستندات NDK للتعرّف على كيفية إنشاء التطبيق من سطر الأوامر باستخدام CMake وndk-build.
Android 13 أو الإصدارات الأقدم: الإعداد
إذا كان جهازك يعمل بالإصدار 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 من المصدر.