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

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

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

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

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

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

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

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

يمكنك عادةً اختيار الصيغة التلقائية "debug" المضمّنة في كل مشروع في "استوديو 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 أو إنشاء جهاز افتراضي (AVD) لاستخدام محاكي Android.

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

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

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

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

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

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

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

ملاحظة: أثناء تصحيح أخطاء التعليمات البرمجية الأصلية التي يحسّنها compilador، قد تظهر لك رسالة التحذير التالية:
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 بدون تعليق execution. ويمكن أن يساعد ذلك في تجنُّب تشويش الرمز البرمجي ببيانات السجلّ.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • يستخدم الجهاز أو المحاكي المستهدَف وحدة معالجة مركزية 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 Studio فقط ما يصل إلى أربع نقاط مراقبة على الأجهزة المستهدَفة التي تعمل بمعمارية x86 أو x86_64. قد توفّر الأجهزة الأخرى عددًا أقل من نقاط المراقبة.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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