بدءًا من NDK r21 والإصدار 10 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 29)، تتيح حزمة Android NDK استخدام HWAddress Sanitizer، المعروفة أيضًا باسم HWASan. لا تتوفّر HWASan إلا على أجهزة 64 بت التي تستخدم معالجات Arm.
HWASan هي أداة لرصد أخطاء الذاكرة تشبه ASan. مقارنةً بأداة ASan الكلاسيكية، تتضمّن HWASan ما يلي:
- نفقات مماثلة لوحدة المعالجة المركزية (نحو الضعف)
- نفقات مماثلة لحجم الرمز (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 (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.
الإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث: إضافة wrap.sh
إذا كنت تستخدم الإصدار 14 من نظام التشغيل Android أو إصدارًا أحدث، يمكنك استخدام نص برمجي wrap.sh لتشغيل تطبيقك القابل للتصحيح على أي جهاز يعمل بنظام التشغيل Android. يمكنك تخطّي هذه الخطوة إذا اخترت اتّباع الخطوات الواردة في تعليمات الإعداد.
اتّبِع التعليمات لـ
تجميع نص برمجي wrap.sh لإضافة النص البرمجي wrap.sh التالي لـ arm64-v8a.
#!/system/bin/sh
LD_HWASAN=1 exec "$@"
الجري
إذا كنت تستخدم إصدارًا أقدم من الإصدار 14 من نظام التشغيل Android أو لم تُضِف نصًا برمجيًا 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 أو إصدار أحدث وشغِّلها كالمعتاد باستخدام Shell.
إذا كنت تستخدم libc++، تأكَّد من استخدام STL المشترَكة ونقلها إلى الجهاز وضبط LD_LIBRARY_PATH على الدليل الذي يحتوي عليها عند تشغيل الملف الثنائي.
إذا كنت لا تستخدم Gradle، يُرجى الاطّلاع على مستندات NDK لمعرفة كيفية الإنشاء من سطر الأوامر باستخدام CMake و ndk-build.
الإصدار 13 من نظام التشغيل Android أو الإصدارات الأقدم: الإعداد
إذا كان جهازك يعمل بالإصدار 14 من نظام التشغيل Android أو إصدار أحدث، يمكنك تخطّي هذه الخطوة واتّباع الـ تعليمات الخاصة باستخدام wrap.sh في قسم الـإنشاء. يمكنك أيضًا اختيار اتّباع التعليمات الواردة في هذا القسم وتخطّي التعليمات الخاصة باستخدام wrap.sh.
قبل الإصدار 14 من نظام التشغيل Android، تحتاج تطبيقات HWASan إلى إصدار HWASan من Android لتشغيلها. يمكنك تثبيت ذاكرة ROM لصور HWASan المُنشأة مسبقًا على أجهزة Pixel المتوافقة. تتوفّر الإصدارات على ci.android.com، حيث يمكنك النقر على المربّع للإصدار الدقيق الذي تريد الحصول عليه للحصول على رابط تثبيت الإصدار. يتطلّب ذلك معرفة الاسم الرمزي لهاتفك.
قد يكون من الأسهل بدلاً من ذلك الانتقال مباشرةً إلى flash.android.com لأنّ عملية التثبيت تبدأ هناك برصد جهازك ولا تعرض لك سوى الإصدارات التي يمكنك استخدامها. توضّح الصورتان التاليتان عملية الإعداد في هذه الأداة.
فعِّل وضع مطور البرامج على جهازك ووصِّله بجهاز الكمبيوتر باستخدام كابل USB. انقر على إضافة جهاز جديد، واختَر جهازك من مربّع الحوار، و انقر على ربط.
بعد توصيل جهازك، انقر عليه لضبط إعدادات الإصدار.
في مربّع اختيار رقم تعريف الإصدار ، اختَر فرع aosp-master-with-phones-throttled لاختيار الصورة الصحيحة تلقائيًا للجهاز الذي وصّلته.
انقر على تثبيت لتثبيت ذاكرة ROM على جهازك.
يمكنك الاطّلاع على مزيد من التفاصيل حول عملية الإعداد اللازمة في مستندات "أداة الفلاش في Android". بدلاً من ذلك، يمكنك الاطّلاع على مستندات نظام التشغيل Android للحصول على تعليمات حول إنشاء صورة HWASan من المصدر.