معقّم HWAddress

تتوافق تقنية NDK من Android مع HWAddress Sanitizer، المعروف أيضًا باسم HWASan، الذي يبدأ بـ NDK r21 وAndroid 10 (مستوى واجهة برمجة التطبيقات 29). HWSan متاح فقط على أجهزة 64 بت الذراع.

HWASan هي أداة لرصد أخطاء الذاكرة تشبه أداة ASan. مقارنةً بنظام التشغيل ASan الكلاسيكي، يحتوي تطبيق HWASan على ما يلي:

  • تكاليف مماثلة لوحدة المعالجة المركزية (CPU) تقريبًا (2x تقريبًا)
  • النفقات الزائدة لحجم الرمز (40 – 50%)
  • تكاليف ذاكرة وصول عشوائي أصغر بكثير (10% – 35%)

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

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

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

  • استخدام الحزمة بعد العودة

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

يوضّح نموذج التطبيق كيفية ضبط صيغة مختلفة من أجل الحواس.

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

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

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

إنشاء تصميم فلاش

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

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

اكتشاف جهاز فلاش اختَر الجهاز الذي تريد ربطه بـ

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

اختَر الجهاز لتشغيل ضوء الفلاش تأكيد خيارات الفلاش ووميض الجهاز

انقر على تثبيت لوميض جهازك.

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

إنشاء

لإنشاء رمز أصلي لتطبيقك (JNI) باستخدام أداة HWAddress Sanitizer، يُرجى اتّباع الخطوات التالية:

إنشاء إصدارات جديدة

في ملف 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

صناعة

في ملف 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)

الإصدار 14 من نظام Android أو الإصدارات الأحدث: إضافة التفاف.sh

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

اتّبِع التعليمات لتغليف نص برمجي التفاف.sh لإضافة النص البرمجي التالي الذي يتضمن التفافًا حول arm64-v8a.

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

تنفيذ

يمكنك تشغيل التطبيق كالمعتاد على صورة Android تم إنشاؤها بواسطة HWASan. عند رصد خطأ في الذاكرة، يتعطّل التطبيق باستخدام SIGABRT ويُطبع رسالة مفصّلة إلى سجلّات. يمكن العثور على نسخة من الرسالة في ملف ضمن /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.