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

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

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

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

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

قبل البدء في تصحيح الأخطاء، عليك إجراء ما يلي:

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

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

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

Groovy

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

Kotlin

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. انقر على ربط أداة تصحيح الأخطاء بعملية Android .
  2. في مربّع الحوار اختيار العملية، اختَر العملية التي تريد ربط مصحّح الأخطاء بها.
    1. إذا كنت تستخدم محاكيًا أو جهازًا تم عمل روت له، يمكنك وضع علامة في المربّع بجانب عرض جميع العمليات للاطّلاع على جميع العمليات. على جهاز تم عمل روت له، سيتم عرض جميع العمليات الجارية على الجهاز. ومع ذلك، لن يعرض هذا الأمر على جهاز غير مجذَّر سوى العمليات التي يمكن تصحيح أخطائها.
    2. من القائمة استخدام إعدادات مصحّح أخطاء Android من، يمكنك اختيار إعداد تشغيل/تصحيح أخطاء حالي. بالنسبة إلى رموز C وC++‎، يتيح لك ذلك إعادة استخدام أوامر بدء تشغيل LLDB وأوامر ما بعد الربط ودلائل الرموز في إعداد حالي.
    3. إذا لم يكن لديك إعداد حالي لتشغيل/تصحيح الأخطاء، انقر على إنشاء إعداد جديد. يتيح هذا الخيار قائمة نوع تصحيح الأخطاء، حيث يمكنك اختيار نوع مختلف لتصحيح الأخطاء. يستخدم Android Studio تلقائيًا نوع تصحيح الأخطاء "الاكتشاف التلقائي" لاختيار أفضل خيار لتصحيح الأخطاء لك استنادًا إلى ما إذا كان مشروعك يتضمّن رمز 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 Studio تلقائيًا نوع تصحيح الأخطاء المزدوج. وفي ما عدا ذلك، يستخدم "استوديو Android" نوع تصحيح الأخطاء Java-Only.
جافا فقط
اختَر نوع تصحيح الأخطاء هذا إذا كنت تريد تصحيح الأخطاء في الرموز المكتوبة بلغة Java أو Kotlin فقط. يتجاهل مصحّح الأخطاء Java-Only أي نقاط إيقاف أو عمليات مراقبة تحدّدها في الرمز البرمجي الأصلي.
الرمز البرمجي الأصلي فقط (يتوفّر مع رمز 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 Studio كلاً من مصحّح أخطاء 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 Studio نقاط توقّف تؤدي إلى تشغيل إجراءات تصحيح أخطاء مختلفة. هناك عدة أنواع من نقاط الإيقاف:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

عرض نقاط التوقّف وضبطها

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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