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

يوفّر "استوديو 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" تلقائيًا نوع تصحيح الأخطاء "الرصد التلقائي" لتحديد الخيار الأفضل لبرنامج تصحيح الأخطاء لك استنادًا إلى ما إذا كان مشروعك يتضمّن رمز 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. يفحص 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. مفتاح التبويب لتصحيح أخطاء الرموز البرمجية الأصلية ومفتاح التبويب لتصحيح أخطاء رموز 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 بدون تعليق التنفيذ. ويمكن أن يساعد ذلك في تجنُّب تشويش الرمز البرمجي ببيانات السجلّ.

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

  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++. وتتوفّر أيضًا لوحات "الإطارات" و"المتغيّرات" و"الساعات" وتعمل تمامًا كما لو كنت تُصحح أخطاء رمز 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 يحدّد نقطة المراقبة فقط لوحدة الذاكرة التي يخصّصها النظام لهذا المتغيّر، وليس المتغيّر نفسه. يختلف ذلك عن إضافة متغيّر إلى لوحة "المراقِبات"، التي تتيح لك مراقبة قيمة متغيّر، ولكنّها لا تسمح لك بتعليق عملية تطبيقك عندما يقرأ النظام قيمته في الذاكرة أو يغيّرها.

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

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

  • يستخدم جهازك المادي أو المحاكي المستهدَف وحدة معالجة مركزية (CPU) x86 أو x86_64. إذا كان جهازك يستخدم وحدة معالجة مركزية (CPU) من نوع ARM، عليك ضبط حدود عنوانvariabile في الذاكرة على 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‏ (32 بت)، قد تؤدي إضافة نقطة مراقبة أو تمرير مؤشر الماوس فوق المتغيّرات داخل الرمز البرمجي للتحقيق من قيمها إلى حدوث عطل. وكحل بديل، يمكنك تصحيح الأخطاء باستخدام البرامج الثنائية التي تستخدم معالجات ARM أو x86 أو x86_64 بسرعة 64 بت. سيتم حلّ هذه المشكلة في إصدار قادم من Android Studio.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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