تصحيح أخطاء تطبيقك

يوفّر "استوديو Android" مصحِّح أخطاء يتيح لك تنفيذ ما يلي والمزيد:

  • اختَر جهازًا لتصحيح أخطاء تطبيقك عليه.
  • يمكنك ضبط نقاط توقُّف في رموز Java وKotlin وC/C++‎.
  • فحص المتغيرات وتقييم التعبيرات في وقت التشغيل.

تتضمّن هذه الصفحة تعليمات حول العمليات الأساسية لتصحيح الأخطاء. لمزيد من المعلومات، يمكنك أيضًا الاطّلاع على مستندات تصحيح الأخطاء في IntelliJ IDEA.

تفعيل تصحيح الأخطاء

قبل البدء في تصحيح الأخطاء، اتّبِع الخطوات التالية:

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

استخدِم تنويعة تصميم تتضمّن debuggable true (isDebuggable = true في نصوص Kotlin البرمجية) في إعدادات التصميم.

عادةً، يمكنك اختيار صيغة "تصحيح الأخطاء" التلقائية المضمّنة في كل مشروع في "استوديو Android"، على الرغم من أنّها غير مرئية في ملف build.gradle. ومع ذلك، إذا حدّدت أنواع إصدارات جديدة قابلة للتصحيح، يجب إضافة debuggable true إلى نوع الإصدار:

أنيق

android {
    buildTypes {
        customDebugType {
            debuggable true
            ...
        }
    }
}

Kotlin

android {
    buildTypes {
        create("customDebugType") {
            isDebuggable = true
            ...
        }
    }
}

تنطبق هذه السمة أيضًا على الوحدات التي تحتوي على رمز C/C++‎ البرمجي.

ملاحظة: لم تعُد السمة jniDebuggable مستخدَمة.

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

بدء تصحيح الأخطاء

يمكنك بدء جلسة تصحيح أخطاء على النحو التالي:

  1. اضبط نقاط التوقف في رمز تطبيقك.
  2. في شريط الأدوات، اختَر جهازًا لتصحيح أخطاء تطبيقك عليه من قائمة أجهزة الاختبار.
    قائمة أجهزة الاختبار
    الشكل 1: قائمة جهاز الاختبار

    إذا لم تكن لديك أي أجهزة تم ضبطها، عليك إما توصيل جهاز عبر USB أو توصيل جهاز عبر Wi-Fi أو إنشاء جهاز Android افتراضي لاستخدام Android Emulator.

  3. في شريط الأدوات، انقر على تصحيح الأخطاء .

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

    إذا أضفت رمز C وC++‎ إلى مشروعك، سيشغّل "استوديو Android" أيضًا مصحِّح أخطاء LLDB في نافذة "تصحيح الأخطاء" لتصحيح أخطاء الرموز البرمجية الأصلية.

  4. إذا لم تكن نافذة "تصحيح الأخطاء" مفتوحة، اختَر عرض > نوافذ الأدوات > تصحيح الأخطاء، أو انقر على تصحيح الأخطاء في شريط نافذة الأدوات.

ربط برنامج تصحيح الأخطاء بتطبيق قيد التشغيل

إذا كان تطبيقك قيد التشغيل على جهازك، يمكنك بدء تصحيح الأخطاء بدون إعادة تشغيل تطبيقك على النحو التالي:

  1. انقر على إرفاق مصحِّح الأخطاء بعملية Android .
  2. في مربّع الحوار اختيار عملية (Choose Process)، اختَر العملية التي تريد إرفاق مصحِّح الأخطاء بها.
    1. إذا كنت تستخدم محاكيًا أو جهازًا جذرًا، يمكنك وضع علامة في المربّع بجانب عرض جميع العمليات للاطّلاع على جميع العمليات. على الجهاز الجذر، سيعرض هذا جميع العمليات التي يتم تشغيلها على الجهاز. ومع ذلك، على جهاز غير جذر، لن يعرض هذا سوى العمليات القابلة للتصحيح.
    2. من قائمة استخدام إعدادات مصحِّح أخطاء Android من، يمكنك اختيار إعدادات التشغيل/تصحيح الأخطاء حالية. بالنسبة إلى رموز C وC++‎، يتيح لك ذلك إعادة استخدام أوامر بدء تشغيل LLDB وأوامر LLDB بعد الإرفاق وأدلة الرموز في إعدادات حالية.
    3. إذا لم يكن لديك إعدادات حالية للتشغيل/تصحيح الأخطاء، اختَر إنشاء إعدادات جديدة. يؤدي هذا الاختيار إلى تفعيل قائمة نوع تصحيح الأخطاء، حيث يمكنك اختيار نوع تصحيح أخطاء مختلف. يستخدم "استوديو Android" تلقائيًا نوع تصحيح الأخطاء "الرصد تلقائيًا" لتحديد أفضل خيار لتصحيح الأخطاء استنادًا إلى ما إذا كان مشروعك يتضمّن رمز Java أو C/C++‎.
  3. انقر على موافق.

    ستظهر نافذة "تصحيح الأخطاء".

تحتوي علامة التبويب العمليات في Device Explorer (عرض > نوافذ الأدوات > Device Explorer) أيضًا على قائمة بالعمليات القابلة للتصحيح. من هناك، يمكنك اختيار عملية وإيقافها أو فرض إيقافها أو إرفاق مصحِّح الأخطاء بعملية معيّنة .

نافذة تصحيح الأخطاء

الشكل 2:نافذة تصحيح الأخطاء

تنقسم نافذة تصحيح الأخطاء إلى

  1. شريط أدوات التنفيذ والتنقّل: يُرجى الاطّلاع على العمل باستخدام نقاط الإيقاف
  2. أداة اختيار سلسلة المحادثات
  3. إدخال تعبير التقييم والمراقبة يُرجى الاطّلاع على فحص المتغيّرات.
  4. عرض الحزمة
  5. لوحة "المتغيّرات" يُرجى الاطّلاع على فحص المتغيّرات.

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

تغيير نوع برنامج تصحيح الأخطاء

بما أنّ أدوات تصحيح الأخطاء المختلفة مطلوبة لتصحيح أخطاء رموز Java/Kotlin ورموز C/C++‎، تتيح لك أداة تصحيح الأخطاء في استوديو Android اختيار نوع أداة تصحيح الأخطاء التي تريد استخدامها. يحدّد "استوديو Android" تلقائيًا برنامج تصحيح الأخطاء الذي سيتم استخدامه استنادًا إلى اللغات التي يرصدها في مشروعك باستخدام نوع برنامج تصحيح الأخطاء الرصد تلقائيًا.

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

تشمل أنواع تصحيح الأخطاء المتاحة ما يلي:

الرصد تلقائيًا
اختَر نوع تصحيح الأخطاء هذا إذا أردت أن يحدّد "استوديو Android" تلقائيًا أفضل خيار للرمز الذي يتم تصحيح أخطائه. على سبيل المثال، إذا كان لديك أي رمز C أو C++‎ في مشروعك، سيستخدم "استوديو Android" تلقائيًا نوع تصحيح الأخطاء "المزدوج". وإلا، سيستخدم "استوديو Android" نوع تصحيح الأخطاء Java-Only.
Java فقط
يُرجى اختيار نوع تصحيح الأخطاء هذا إذا أردت تصحيح أخطاء الرموز البرمجية المكتوبة بلغة Java أو Kotlin فقط. يتجاهل مصحِّح الأخطاء المخصَّص للغة Java فقط أي نقاط توقُّف أو مراقبة تضبطها في الرموز البرمجية الأصلية.
"الرمز البرمجي الأصلي فقط" (Native Only) (متاح فقط مع رمز C/C++‎)
اختَر نوع تصحيح الأخطاء هذا إذا كنت تريد استخدام LLDB فقط لتصحيح أخطاء الرمز البرمجي. عند استخدام نوع تصحيح الأخطاء هذا، لا يتوفّر عرض جلسة مصحِّح أخطاء Java. By default, LLDB inspects only your native code and ignores breakpoints in your Java code. إذا أردت أيضًا تصحيح أخطاء رمز Java، يمكنك التبديل إلى نوع تصحيح الأخطاء "رصد تلقائي" (Detect Automatically) أو "مزدوج" (Dual).

لا تعمل ميزة تصحيح الأخطاء في الرموز البرمجية الأصلية إلا على الأجهزة التي تستوفي المتطلبات التالية:

  • يتوافق الجهاز مع run-as.

    للتحقّق مما إذا كان الجهاز متوافقًا مع run-as، شغِّل الأمر التالي في واجهة ADB البرمجية المتصلة بجهازك:

    run-as your-package-name pwd
    

    استبدِل your-package-name باسم حزمة تطبيقك. إذا كان الجهاز متوافقًا مع run-as، من المفترض أن يتم تنفيذ الأمر بدون أي أخطاء.

  • تم تفعيل ptrace على الجهاز.

    للتحقّق مما إذا كان ptrace مفعَّلاً، شغِّل الأمر التالي في واجهة برمجة تطبيقات ADB المتصلة بجهازك:

    sysctl kernel.yama.ptrace_scope
    

    إذا كان ptrace مفعَّلاً، سيطبع الأمر القيمة 0 أو خطأ unknown key. إذا لم يتم تفعيل ptrace، ستتم طباعة قيمة غير 0.

ثنائي (Java + أصلي) - متاح فقط مع رمز C/C++‎
اختَر نوع تصحيح الأخطاء هذا إذا أردت التبديل بين تصحيح أخطاء كل من رمز Java والرموز البرمجية الأصلية. يربط استوديو Android كلاً من مصحّح أخطاء Java وLLDB بعملية تطبيقك حتى تتمكّن من فحص نقاط التوقف في كل من رمز Java والرموز البرمجية الأصلية بدون إعادة تشغيل تطبيقك أو تغيير إعدادات تصحيح الأخطاء.

في الشكل 2، لاحظ علامتَي التبويب على يسار عنوان نافذة "تصحيح الأخطاء". بما أنّ التطبيق يحتوي على رمز Java ورمز C++‎، تكون إحدى علامات التبويب مخصّصة لتصحيح أخطاء الرمز البرمجي الأصلي والأخرى لتصحيح أخطاء رمز Java، كما هو موضّح في -java.

الشكل 3. علامة تبويب لتصحيح أخطاء الرموز البرمجية الأصلية وعلامة تبويب لتصحيح أخطاء رموز Java البرمجية

ملاحظة: أثناء تصحيح أخطاء الرموز البرمجية الأصلية التي تم تحسينها من خلال برنامج التجميع، قد تظهر لك رسالة التحذير التالية:
This function was compiled with optimizations enabled. Some debugger features may not be available. عند استخدام علامات التحسين، يُجري برنامج التجميع تغييرات على الرمز البرمجي المجمَّع ليعمل بكفاءة أكبر. قد يؤدي ذلك إلى إبلاغ مصحِّح الأخطاء عن معلومات غير متوقعة أو غير صحيحة لأنّه يصعب على مصحِّح الأخطاء ربط الرمز البرمجي المجمَّع المحسَّن بالرمز المصدر الأصلي. لهذا السبب، يجب إيقاف تحسينات برنامج التجميع أثناء تصحيح أخطاء الرموز البرمجية الأصلية.

استخدام سجلّ النظام

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

كتابة رسائل السجلّ في الرمز البرمجي

لكتابة رسائل السجلّ في الرمز البرمجي، استخدِم الفئة Log. تساعدك الرسائل المسجّلة في فهم مسار التنفيذ من خلال جمع مخرجات تصحيح أخطاء النظام أثناء تفاعلك مع تطبيقك. ويمكن أن تخبرك الرسائل المسجّلة أيضًا بالجزء الذي تعطل في تطبيقك. لمزيد من المعلومات حول التسجيل، يُرجى الاطّلاع على مقالة كتابة السجلّات وعرضها باستخدام Logcat.

يوضّح المثال التالي كيفية إضافة رسائل مسجّلة لتحديد ما إذا كانت معلومات الحالة السابقة متاحة عند بدء نشاطك:

Kotlin

import android.util.Log
...
class MyActivity : Activity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state")
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available")
            /* initialize app */
        }
        ...
    }
  ...
  companion object {
    private val TAG: String = MyActivity::class.java.simpleName
    ...
  }
}

Java

import android.util.Log;
...
public class MyActivity extends Activity {
    private static final String TAG = MyActivity.class.getSimpleName();
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
       ...
       if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state");
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available");
            /* initialize app */
        }
        ...
    }
}

أثناء عملية التطوير، يمكن للرمز البرمجي أيضًا رصد الاستثناءات وكتابة تتبُّع تسلسل استدعاء الدوال البرمجية في سجلّ النظام:

Kotlin

fun someOtherMethod() {
    try {
        ...
    } catch (e : SomeException) {
        Log.d(TAG, "someOtherMethod()", e)
    }
}

Java

void someOtherMethod() {
    try {
        ...
    } catch (SomeException e) {
        Log.d(TAG, "someOtherMethod()", e);
    }
}

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

عرض سجلّ النظام

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

لاستخدام Logcat، ابدأ تصحيح الأخطاء واختَر علامة التبويب Logcat.

الشكل 4. نافذة Logcat مع إعدادات الفلتر

للحصول على وصف لأداة Logcat وخيارات الفلترة فيها، يُرجى الاطّلاع على مقالة كتابة السجلّات وعرضها باستخدام Logcat.

العمل مع نقاط التوقف

يتيح "استوديو Android" استخدام نقاط التوقف التي تؤدي إلى تنفيذ إجراءات تصحيح أخطاء مختلفة. هناك عدة أنواع من نقاط الإيقاف:

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

يمكنك ضبط نقاط توقّف شرطية تعلّق التنفيذ فقط في حال استيفاء شروط معيّنة. يمكنك أيضًا ضبط نقاط توقّف التسجيل التي تكتب في Logcat بدون تعليق التنفيذ. يمكن أن يساعد ذلك في تجنُّب ملء الرمز ببيانات التسجيل.

لإضافة نقطة توقّف في سطر، اتّبِع الخطوات التالية:

  1. ابحث عن سطر الرمز الذي تريد إيقاف التنفيذ مؤقتًا عنده.
  2. انقر على الهامش الأيسر بجانب سطر الرمز هذا أو ضع علامة الإقحام على السطر واضغط على Control+F8 (على نظام التشغيل macOS، اضغط على Command+F8).
  3. إذا كان تطبيقك قيد التشغيل، انقر على إرفاق مصحِّح الأخطاء بعملية Android . بخلاف ذلك، لبدء تصحيح الأخطاء، انقر على تصحيح الأخطاء .

تظهر نقطة حمراء بجانب السطر عند ضبط نقطة توقّف، كما هو موضّح في الشكل 5.

الشكل 5. تظهر نقطة حمراء بجانب السطر عند ضبط نقطة توقّف.

عندما يصل تنفيذ الرمز إلى نقطة التوقف، يوقف "استوديو Android" تنفيذ تطبيقك مؤقتًا.

لتحديد حالة التطبيق، استخدِم الأدوات في علامة التبويب "تصحيح الأخطاء":

  • لفحص شجرة العناصر لمتغير، قم بتوسيعها في طريقة عرض المتغيرات. إذا لم تكن طريقة عرض "المتغيّرات" ظاهرة، انقر على إعدادات التنسيق وتأكَّد من وضع علامة في المربّع بجانب المتغيّرات.

  • للانتقال إلى السطر التالي في الرمز بدون إدخال طريقة، انقر على تجاوز .

  • للانتقال إلى السطر الأول داخل طلب إجراء، انقر على الدخول .

  • للانتقال إلى السطر التالي خارج الطريقة الحالية، انقر على الخروج .

  • لمواصلة تشغيل التطبيق بشكل طبيعي، انقر على استئناف البرنامج .

إذا كان مشروعك يستخدم أي رموز برمجية أصلية، فإنّ نوع تصحيح الأخطاء "الرصد تلقائيًا" يربط تلقائيًا كلاً من مصحّح أخطاء Java وLLDB بتطبيقك كعمليتَين منفصلتَين. يمكنك التبديل بين فحص نقاط توقّف Java وC/C++‎ بدون إعادة تشغيل تطبيقك أو تغيير الإعدادات.

ملاحظة: لكي يرصد استوديو Android نقاط التوقف في رمز C أو C++‎، عليك استخدام نوع تصحيح أخطاء يتوافق مع LLDB، مثل "الرصد تلقائيًا" أو "أصلي" أو "مزدوج". يمكنك تغيير نوع تصحيح الأخطاء الذي يستخدمه "استوديو Android" من خلال تعديل إعدادات تصحيح الأخطاء. لمزيد من المعلومات حول أنواع تصحيح الأخطاء المختلفة، يُرجى قراءة القسم حول استخدام أنواع تصحيح الأخطاء الأخرى.

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

الشكل 6. تصحيح أخطاء الرموز البرمجية الأصلية باستخدام LLDB
  1. ينتقل "استوديو Android" إلى علامة التبويب <your-module> عندما يواجه برنامج تصحيح الأخطاء LLDB نقطة توقّف في رمز C/C++‎. تتوفّر أيضًا لوحات "الإطارات" (Frames) و"المتغيّرات" (Variables) و"المراقبة" (Watches) وتعمل تمامًا كما لو كنت تصحّح أخطاء رمز Java.

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

    ملاحظة: أثناء فحص نقطة توقّف في الرموز البرمجية الأصلية، يعلّق نظام Android الجهاز الافتراضي الذي يشغّل الرمز الثنائي لـ Java في تطبيقك. وهذا يعني أنّه لا يمكنك التفاعل مع مصحِّح أخطاء Java أو استرداد أي معلومات عن الحالة من جلسة مصحِّح أخطاء Java أثناء فحص نقطة توقّف في الرموز البرمجية الأصلية.

  2. ينتقل &quot;استوديو Android&quot; إلى علامة التبويب <your-module>-java عندما يعثر مصحِّح أخطاء Java على نقطة توقّف في رمز Java أو Kotlin.
  3. أثناء تصحيح الأخطاء باستخدام LLDB، يمكنك استخدام وحدة طرفية LLDB في عرض جلسة LLDB لتمرير خيارات سطر الأوامر إلى LLDB. إذا كانت لديك أوامر معيّنة تريد أن ينفّذها LLDB في كل مرة تبدأ فيها تصحيح أخطاء تطبيقك، إما قبل أو بعد إرفاق مصحّح الأخطاء بعملية تطبيقك، يمكنك إضافة هذه الأوامر إلى إعدادات تصحيح الأخطاء.

أثناء تصحيح أخطاء رمز C/C++‎، يمكنك أيضًا ضبط أنواع خاصة من نقاط الإيقاف، تُسمى نقاط المراقبة، والتي يمكنها تعليق عملية تطبيقك عندما يتفاعل تطبيقك مع مجموعة معيّنة من الذاكرة. لمزيد من المعلومات، يُرجى الاطّلاع على القسم حول كيفية إضافة نقاط مراقبة.

عرض نقاط الإيقاف وضبطها

لعرض جميع نقاط الإيقاف وضبط إعداداتها، انقر على عرض نقاط الإيقاف في نافذة "تصحيح الأخطاء". ستظهر نافذة "نقاط التوقف" (Breakpoints)، كما هو موضّح في الشكل 7.

الشكل 7. تعرض نافذة "نقاط الإيقاف" (Breakpoints) جميع نقاط الإيقاف الحالية وتتضمّن إعدادات السلوك لكل منها.

تتيح لك نافذة "نقاط الإيقاف" تفعيل كل نقطة إيقاف أو إيقافها من القائمة في اللوحة. إذا تم إيقاف نقطة توقّف، لن يوقف &quot;استوديو Android&quot; تطبيقك مؤقتًا عند الوصول إلى نقطة التوقّف هذه.

اختَر نقطة توقّف من القائمة لضبط إعداداتها. يمكنك ضبط نقطة توقّف ليتم إيقافها في البداية، ثم يفعّلها النظام بعد الوصول إلى نقطة توقّف مختلفة. يمكنك أيضًا ضبط ما إذا كان يجب إيقاف نقطة توقّف بعد الوصول إليها. لضبط نقطة توقّف لأي استثناء، اختَر نقاط توقّف الاستثناءات في قائمة نقاط التوقّف.

لإيقاف جميع نقاط الإيقاف مؤقتًا، انقر على كتم نقاط الإيقاف في نافذة "تصحيح الأخطاء". انقر مرة أخرى لإعادة تفعيلها.

تصحيح أخطاء إطارات النوافذ

في نافذة "برنامج تصحيح الأخطاء" (Debugger)، تتيح لك لوحة "الإطارات" (Frames) فحص إطار حزمة التكديس الذي تسبّب في الوصول إلى نقطة الإيقاف الحالية. يتيح لك ذلك التنقّل في إطار حزمة التكديس وفحصه، بالإضافة إلى فحص قائمة سلاسل المحادثات في تطبيق Android.

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

فحص المتغيّرات

في نافذة &quot;تصحيح الأخطاء&quot;، تتيح لك لوحة &quot;المتغيّرات&quot; فحص المتغيّرات عندما يوقف النظام تطبيقك عند نقطة توقّف وتختار إطارًا من لوحة &quot;الإطارات&quot;. تتيح لك لوحة &quot;المتغيّرات&quot; أيضًا تقييم التعبيرات المخصّصة باستخدام الطرق الثابتة و/أو المتغيّرات المتاحة ضمن الإطار المحدّد.

لإضافة تعبير إلى شجرة العناصر (أثناء تصحيح أخطاء التطبيق):

الشكل 8. شجرة العناصر ومربّع إدخال التعبيرات في نافذة "تصحيح الأخطاء"
  1. أدخِل التعبير الذي تريد مشاهدته أو عرضه
  2. انقر على إضافة إلى التعبيرات الخاضعة للمراقبة أو اضغط على مفتاح Enter لتقييم التعبير مرة واحدة.

بدلاً من ذلك، إذا كانت شجرة العناصر تحتوي على التعبير الذي تريد تتبُّعه، يمكنك سحبه إلى أعلى الشجرة لإضافته كتعبير يتم تتبُّعه.

سيتم تعديل التعبيرات التي تتم مراقبتها عند الوصول إلى نقاط الإيقاف أو عند التنقّل في الرمز البرمجي.

ستبقى التعبيرات التي تم تقييمها معروضة في أعلى شجرة العناصر إلى أن يتم تقييم تعبير آخر يدويًا أو الانتقال إلى الخطوة التالية في الرمز البرمجي.

لإزالة تعبير مراقَب من شجرة العناصر، انقر بزر الماوس الأيمن على التعبير ثم انقر على إزالة المراقبة.

إضافة نقاط مراقبة

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

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

ملاحظة: عندما تخرج عملية تطبيقك من دالة ويلغي النظام تخصيص متغيراتها المحلية من الذاكرة، عليك إعادة تعيين أي نقاط مراقبة أنشأتها لهذه المتغيرات.

لضبط نقطة مراقبة، يجب استيفاء المتطلبات التالية:

  • يستخدم الجهاز الفعلي أو المحاكي المستهدَف وحدة معالجة مركزية (CPU) من النوع x86 أو x86_64. إذا كان جهازك يستخدم وحدة معالجة مركزية (CPU) من نوع ARM، عليك محاذاة حدود عنوان المتغيّر في الذاكرة إلى 4 بايت للمعالجات التي تعمل بنظام 32 بت أو 8 بايت للمعالجات التي تعمل بنظام 64 بت. لمحاذاة متغيّر في الرموز البرمجية الأصلية، حدِّد __attribute__((aligned(num_bytes))) في تعريف المتغيّر، كما هو موضّح أدناه:
    // For a 64-bit ARM processor
    int my_counter __attribute__((aligned(8)));
  • لقد سبق لك تعيين ثلاث نقاط مراقبة أو أقل. يتيح استوديو Android استخدام ما يصل إلى أربع نقاط مراقبة فقط على أجهزة الاختبار x86 أو x86_64. وقد تتيح الأجهزة الأخرى عددًا أقل من نقاط المراقبة.

ملاحظة: عند تصحيح أخطاء تطبيقك باستخدام واجهات ABI لمعالجات ARM ‏32 بت، قد تؤدي إضافة نقطة مراقبة أو تمرير مؤشر الماوس فوق المتغيّرات داخل الرمز البرمجي للتحقّق من قيمها إلى حدوث عطل. كحل بديل، يمكنك تصحيح الأخطاء باستخدام برامج ثنائية 64 بت ARM أو x86 أو x86_64. سيتم حلّ هذه المشكلة في إصدار قادم من "استوديو Android".

إذا كنت تستوفي المتطلبات، يمكنك إضافة نقطة مراقبة على النحو التالي:

  1. أثناء تعليق تطبيقك عند نقطة توقّف، انتقِل إلى لوحة "المتغيّرات" (Variables) في عرض جلسة LLDB.
  2. انقر بزر الماوس الأيمن على متغيّر يشغل مجموعة الذاكرة التي تريد تتبُّعها، ثم اختَر إضافة نقطة مراقبة.

    الشكل 9: إضافة نقطة مراقبة إلى متغيّر في الذاكرة
  3. يظهر مربّع حوار لضبط نقطة المراقبة، كما هو موضّح في الشكل 9.

    اضبط نقطة المراقبة باستخدام الخيارات التالية:

    • مفعَّلة: يمكنك إلغاء تحديد هذا الخيار إذا أردت إعلام Android Studio بتجاهل نقطة المراقبة إلى أن تغيّر الإعداد. يحفظ Android Studio نقطة المراقبة لتتمكّن من الوصول إليها لاحقًا.
    • التعليق: يعلّق نظام Android تلقائيًا عملية تطبيقك عندما يصل إلى مجموعة من الذاكرة التي تخصّصها لنقطة مراقبة. ألغِ تحديد هذا الخيار إذا كنت لا تريد هذا السلوك. يكشف هذا عن خيارات إضافية يمكنك استخدامها لتخصيص السلوك عندما يتفاعل النظام مع نقطة المراقبة: تسجيل الرسالة في وحدة التحكّم والإزالة عند الوصول.
    • نوع الوصول: اختَر ما إذا كان يجب أن يشغّل تطبيقك نقطة المراقبة عندما يحاول قراءة أو كتابة كتلة الذاكرة التي يخصّصها النظام للمتغيّر. لتشغيل نقطة المراقبة عند القراءة أو الكتابة، اختَر أيّ.
  4. انقر على تم.

لعرض جميع نقاط المراقبة وضبط إعداداتها، انقر على عرض نقاط الإيقاف في نافذة "تصحيح الأخطاء". يظهر مربّع الحوار "نقاط الإيقاف" (Breakpoints)، كما هو موضّح في الشكل 10.

الشكل 10: يعرض مربّع الحوار "نقاط التوقف" (Breakpoints) نقاط المراقبة الحالية ويتضمّن إعدادات السلوك لكل منها.

بعد إضافة نقطة المراقبة، انقر على استئناف البرنامج (Resume Program) في نافذة &quot;تصحيح الأخطاء&quot; (Debug) لاستئناف عملية التطبيق. إذا حاول تطبيقك الوصول إلى مجموعة من الذاكرة التي تم ضبط نقطة مراقبة لها، يعلّق نظام Android عملية تطبيقك تلقائيًا ويظهر رمز نقطة المراقبة بجانب سطر الرمز الذي نفّذه تطبيقك مؤخرًا، كما هو موضّح في الشكل 11.

الشكل 11: يشير "استوديو Android" إلى سطر الرمز البرمجي الذي ينفّذه تطبيقك قبل تفعيل نقطة مراقبة مباشرةً.

عرض تنسيق عرض قيمة المورد وتغييره

في وضع تصحيح الأخطاء، يمكنك عرض قيم الموارد واختيار تنسيق عرض مختلف للمتغيّرات في رمز Java أو Kotlin. بعد عرض علامة التبويب "المتغيّرات" واختيار إطار، اتّبِع الخطوات التالية:

  1. في قائمة &quot;المتغيّرات&quot;، انقر بزر الماوس الأيمن على أي مكان في سطر المورد لعرض القائمة.
  2. في القائمة، انقر على عرض كـ واختَر التنسيق الذي تريد استخدامه.

    تعتمد التنسيقات المتاحة على نوع بيانات المرجع الذي اخترته. قد يظهر لك خيار واحد أو أكثر من الخيارات التالية:

    • الصف: لعرض تعريف الصف
    • ‫toString: لعرض تنسيق السلسلة
    • الكائن: يعرض تعريف الكائن (مثيل لفئة).
    • مصفوفة: يتم عرض البيانات بتنسيق مصفوفة.
    • الطابع الزمني: يتم عرض التاريخ والوقت على النحو التالي: yyyy-mm-dd hh:mm:ss.
    • تلقائي: يختار Android Studio أفضل تنسيق استنادًا إلى نوع البيانات.
    • ثنائي: لعرض قيمة ثنائية باستخدام الأصفار والآحاد.
    • MeasureSpec: القيمة التي تم تمريرها من العنصر الرئيسي إلى العنصر الثانوي المحدّد. يمكنك الاطّلاع على MeasureSpec.
    • نظام العد الستة عشري: يتم عرض القيمة بنظام العد الستة عشري.
    • بدائي: يتم العرض كقيمة رقمية باستخدام نوع بيانات بدائي.
    • عدد صحيح: يتم العرض كقيمة رقمية من النوع Integer.

لإنشاء تنسيق مخصّص، اتّبِع الخطوات التالية:

  1. انقر بزر الماوس الأيمن على قيمة المرجع.
  2. انقر على العرض باسم.
  3. انقر على إنشاء.
  4. يظهر مربّع الحوار Java Data Type Renderers. اتّبِع التعليمات الواردة في أدوات عرض أنواع بيانات Java.