تصحيح أخطاء تلف الذاكرة باستخدام العناوين المصححة

يوضح لك هذا المستند كيفية تفعيل أدوات تصحيح الأخطاء الخاصة عند استخدام AGDE. يمكن أن تساعد هذه الأدوات في حل تلف الذاكرة الذي يصعب تشخيصه واستبدال الأخطاء.

معقّم HWAddress ومعقّم العناوين

HWAddress Sanitizer (HWASan) وAddress Sanitizer (ASan) هما أداتان لتصحيح تلف الذاكرة وهما يساعدان في تصحيح أخطاء تلف الذاكرة واستبدال الأخطاء، مثل ما يلي:

  • التدفقات الزائدة والداخلية للمخزن المؤقت لحزمة المكدسات
  • التدفقات الزائدة والداخلية للمخزن المؤقت للذاكرة
  • تكديس الاستخدام خارج نطاقه
  • أخطاء حرة مزدوجة ومجانية
  • استخدام التكدس بعد الإرجاع (HWASan فقط)

لا ننصح بتفعيل HWASan أو ASan إلا عند تصحيح إحدى المشاكل أو كجزء من الاختبار الآلي. بالرغم من أداء هذه الأدوات، إلا أن استخدامها يتحمل عقوبةً.

سلوك وقت التشغيل

عند تفعيلهما، يتحقق كل من HWASan وASan تلقائيًا من تلف الذاكرة لوقت تشغيل تطبيقك بالكامل.

في حال اكتشاف خطأ في الذاكرة، يتعطل التطبيق مع عرض خطأ SIGBART (إلغاء الإشارة) ويطبع رسالة تفصيلية إلى 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 من نظام التشغيل Android

لاستخدام HWASan، اتّبِع تعليمات الإعداد الواردة في مستندات HWASan لتثبيت إصدار HWASan من نظام التشغيل Android لأجهزة Google Pixel.

بالنسبة إلى الأجهزة الأخرى، يمكنك التواصل مع الشركة المصنّعة للحصول على إصدار HWASan من نظام التشغيل، إن وُجد، أو استخدام أداة ASan المخصّصة للبرامج فقط.

استخدام المكتبة العادية المشتركة لـ C++ في مشروعك

بسبب مشكلة معروفة، لا تتوافق ASan مع معالجة استثناء C++ عند استخدام libc++_static. ولا تظهر هذه المشكلة عند استخدام "libc++_shared".

تمتلك HWASan تطبيقها الخاص للعاملين new وdelete، والتي لا يمكن استخدامها إذا كانت المكتبة القياسية مرتبطة بشكل ثابت بالمشروع.

لتغيير هذا الإعداد، يُرجى الاطّلاع على قسم ربط مكتبة C++ Standard في هذا المستند.

تفعيل ميزة إنشاء مؤشر الإطار

يستخدم HWASan وASan برنامج فك سريعًا استنادًا إلى مؤشر الإطار لإنشاء معلومات تتبُّع تسلسل استدعاء الدوال البرمجية لأحداث تخصيص الذاكرة وأحداث الصفقات. وهذا يعني أنّه يجب تفعيل ميزة إنشاء مؤشر الإطار في إعدادات برنامج التجميع على لغة C++ الخاصة بك لاستخدام هذه الميزات. أي يجب عليك إيقاف تحسين حذف مؤشر الإطار.

لتغيير هذا الإعداد، يُرجى الاطّلاع على القسم تفعيل إنشاء مؤشر الإطار في هذا المستند.

ضبط مشروع Visual Studio لاستخدام HWASan أو ASan

تفعيل HWASan أو ASan

لتفعيل HWASan أو ASan، انتقِل إلى Configuration Properties (خصائص الإعداد) > General (عام) في Property Sheet (صفحات الخصائص) لمشروعك.

قائمة خصائص Visual Studio Solution Explorer (مستكشف حلول Visual Studio) للمشروع الحالي.

الشكل 1: خيار خصائص المشروع في نافذة "مستكشف حلول Visual Studio".

مربع حوار "صفحات الموقع" بالمشروع مع الخصائص العامة المعروضة،
مع تمييز إعدادات العنوان.

الشكل 2: إعداد معالج العنوان (ASan) في خصائص المشروع العامة.

لتفعيل HWASan لمشروعك، غيِّر إعداد Address Sanitizer (ASan) إلى Hardware ASan Enabled (fsanitize=hwaddress).

لتمكين ASan لمشروعك، غيّر إعداد Address Sanitizer (ASan) إلى ASan Enabled (fsanitize=address).

جارٍ تفعيل ميزة إنشاء مؤشر الإطار

يتم التحكّم في إنشاء مؤشر الإطار باستخدام إعداد برنامج التحويل البرمجي Omit Frame Pointer C/C++ ، ويمكن العثور عليهما في صفحات الخصائص ضمن مشروعك ضمن خصائص الإعدادات > C/C++ > التحسين.

مربع حوار "صفحات الموقع" للمشروع مع خصائص تحسين C/C++ المعروضة،
وحذف إعدادات مؤشر الإطار
المحدد.

الشكل 3: مكان العثور على الإعداد مؤشّر الإطار Omit

عند استخدام HWASan أو ASan، اضبط الإعداد Omit Frame Pointer على لا (-fno-omit-frame-pointer).

ربط مكتبة C++ العادية في وضع المكتبة المشتركة

يمكن العثور على إعداد وضع الرابط لمكتبة C++ العادية في صفحات الموقع الخاصة بالمشروع ضمن خصائص الإعداد > عام، في قسم الإعدادات التلقائية للمشروع.

مربع حوار "صفحات الموقع" للمشروع مع تحديد الفئة العامة،
وتحديد إعداد استخدام STL.

الشكل 4: مكان العثور على إعداد وضع الرابط لمكتبة C++ العادية

أثناء استخدام HWASan أو ASan، اضبط Use of STL (استخدام STL) على Use C++ Standard Libraries (.so). تربط هذه القيمة المكتبة القياسية لـ C++ بمشروعك باعتباره مكتبة مشتركة، وهو أمر مطلوب حتى يعمل HWASan وASan بشكل صحيح.

إنشاء إعدادات إصدار لاستخدام "مصحح العناوين"

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

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

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

لإنشاء ضبط الإصدار، من صفحات الخصائص لمشروعك، انقر على الزر مدير الإعداد...، ثم افتح القائمة المنسدلة ضبط الحل النشط. اختَر بعد ذلك وأنشئ إعدادات تصميم جديدة باسم مناسب (على سبيل المثال، تفعيل HWASan).