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

يوفّر "استوديو 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، أو إنشاء نظام AVD لاستخدام محاكي Android.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • يتوافق الجهاز مع 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 + Native) - متاح فقط باستخدام رمز C/C++
اختَر نوع تصحيح الأخطاء هذا إذا كنت تريد التبديل بين تصحيح أخطاء كل من Java والرمز الأصلي. يرفق "استوديو Android" كلاً من برنامج تصحيح أخطاء Java وLLDB بعملية التطبيق حتى تتمكّن من فحص نقاط الإيقاف في كل من لغة Java والرموز البرمجية الأصلية بدون إعادة تشغيل التطبيق أو تغيير إعدادات تصحيح الأخطاء.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

في "استوديو Android"، يمكنك إنشاء نقطة مراقبة أثناء وقت التشغيل من خلال اختيار متغيّر معيّن، إلا أنّ 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" مع ما يصل إلى أربع نقاط مشاهدة فقط على الأجهزة المستهدفة x86 أو x86_64. قد تتوافق الأجهزة الأخرى مع عدد أقل من نقاط المشاهدة.

ملاحظة: عند تصحيح الأخطاء في تطبيقك باستخدام واجهات ABI للإصدار 32 بت من ARM، قد يحدث عُطل في حال إضافة نقطة مراقبة أو تمرير مؤشر الماوس فوق المتغيّرات داخل الرمز للتحقّق من قيمها. وكحل بديل، يمكنك تصحيح الأخطاء باستخدام البرامج الثنائية ARM أو x86 أو x86_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.
    • الخيار التلقائي: يختار "استوديو Android" أفضل تنسيق استنادًا إلى نوع البيانات.
    • ثنائي: عرض قيمة ثنائية باستخدام الأصفار والآحاد.
    • measureSpec: القيمة التي تم تمريرها من العنصر الرئيسي إلى العنصر الفرعي المحدّد. يمكنك الاطّلاع على MeasureSpec.
    • سداسي عشري: يتم عرضه كقيمة سداسية عشرية.
    • أساسية: يتم العرض كقيمة رقمية باستخدام نوع بيانات أولي.
    • عدد صحيح: يتم عرضه كقيمة رقمية من النوع Integer.

لإنشاء تنسيق مخصص، قم بما يلي:

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