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

يوفّر "استوديو 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • يتوافق الجهاز مع "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. اضغط على مفتاح التبويب (Tab) لتصحيح أخطاء الرمز البرمجي الأصلي وعلامة التبويب لتصحيح أخطاء رمز 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 Studio مع نقاط التوقف التي تؤدي إلى تنفيذ إجراءات مختلفة لتصحيح الأخطاء. هناك عدة أنواع من نقاط الإيقاف:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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