تمكين مصحح الأخطاء

الإعلانات

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

 

تمكين مصحح الأخطاء

يوفر اندرويد ستوديو مصحح أخطاء يسمح لك بالقيام بما يلي وأكثر:

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

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

 

تمكين التصحيح


قبل أن تتمكن من بدء التصحيح، تحتاج إلى الإستعداد كما يلي:

  • تمكين تصحيح الأخطاء على جهازك:

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

  • تشغيل متغير بناء قابل للتصحيح:

يجب عليك إستخدام متغير بناء يتضمن debuggable true في تكوين البنية. عادةً، يمكنك فقط تحديد متغير “debug”

الإفتراضي، المضمن في كل مشروع في اندرويد ستوديو (على الرغم من أنه غير مرئي في ملف build.gradle).

ولكن إذا قمت بتعريف أنواع بناء جديدة، والتي يجب تصحيحها، فيجب عليك إضافة `debuggable true` إلى أنواع البناء buildTypes:

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

تنطبق هذه الخاصية أيضاً على النماذج التي تحتوي على أكواد C/C ++. (لم تعد الخاصية jniDebuggable مستخدمة.)

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

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

 

بدء التصحيح


يمكنك بدء جلسة التصحيح كما يلي:

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

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

3. في شريط الأدوات، انقر فوق تصحيح Debug.

إذا رأيت مربع حوار، يسألك عما إذا كنت تريد التبديل من وضع التشغيل إلى وضع التصحيح “switch from Run to

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

فأنقر فوق Cancel Debug ثم قم بربط مصحح الأخطاء بتطبيق قيد التشغيل بدلاً من ذلك.

وإلا فإن، اندرويد ستوديو سيقوم بإنشاء ملف APK وتوقيعه بإستخدام مفتاح التصحيح، وتثبيته على الجهاز المحدد وتشغيله.

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

4. إذا لم تكن نافذة Debug مفتوحة، اختر View> Tool Windows> Debug (أو انقر فوق Debug في شريط نافذة الأدوات)، ثم انقر فوق علامة التبويب Debugger، كما هو موضح في الشكل 1.

الشكل 1. نافذة المصحح، والتي تعرض التسلسل الحالي وشجرة الكائن لمتغيرٍ ما.

 

ربط المصحح بتطبيق قيد التشغيل

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

  1. انقر فوق Attach debugger to Android process.
  2. في مربع الحوار Choose Process، حدد العملية التي تريد ربط مصحح الأخطاء بها.

إذا كنت تستخدم محاكي أو جهاز قد تم كسر حمايته Root، فيمكنك اختيار Show all processes لرؤية كافة العمليات.

من القائمة المنسدلة Debugger، يمكنك اختيار نوع تصحيح مختلف. بشكلٍ إفتراضي، يستخدم اندرويد ستوديو نوع

التصحيح التلقائي Auto، لتحديد أفضل خيار مصحح لك، بناءً على ما إذا كان مشروعك يتضمن أكواد Java أو C / C ++.

3. أضغط OK.
سوف تظهر نافذة Debug.

ملاحظة: تم دمج مصحح أخطاء اندرويد ستوديو و جامع القمامه garbage collector على نحوٍ ضعيف. يضمن الجهاز الظاهري لأندرويد أن أي كائن يعرفه مصحح الأخطاء، لا يتم تجميع قمامته إلا بعد قطع اتصال المصحح.

يمكن أن يؤدي هذا إلى تراكم الكائنات بمرور الوقت، أثناء اتصال المصحح.

مثال، إذا رأى المصحح تسلسلٍ ما Thread قيد التشغيل، فلن يتم تجميع كائن التسلسل المقترن إلى أن يتم قطع اتصال المصحح، حتى لو تم إنهاء هذا التسلسل.

 

تغيير نوع المصحح


نظراً لأن أدوات تصحيح الأخطاء المختلفة، مطلوبة لتصحيح أكواد Java / Kotlin وأكواد C / C ++، فإن مصحح أخطاء اندرويد ستوديو

يسمح لك بتحديد، نوع مصحح الأخطاء الذي يجب إستخدامه.

يقرر اندرويد ستوديو بشكلٍ إفتراضي، المصحح الذي يجب إستخدامه بناءً على اللغات التي يكتشفها في مشروعك (بإستخدام نوع المصحح التلقائي Auto).

مع ذلك، يمكنك تحديد مصحح الأخطاء يدوياً في تكوين مصحح الأخطاء (انقر فوق Run > Edit Configurations) أو في مربع

الحوار الذي يظهر عند الضغط على Run > Attach debugger to Android process.

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

التلقائي Auto

حدد نوع التصحيح هذا، إذا أردت من اندرويد ستوديو، أن يحدد الخيار الأفضل تلقائياً، للكود الذي تقوم بتصحيحه. مثال، إذا كان لديك أي أكواد C أو C ++ في مشروعك، سوف يستخدم اندرويد ستوديو تلقائياً نوع المصحح المزدوج Dual. خلاف ذلك، سوف يستخدم نوع التصحيح Java.

جافا Java

حدد نوع التصحيح هذا، إذا أردت تصحيح الأكواد المكتوبة بلغة Java أو Kotlin فقط — يتجاهل مصحح أخطاء Java أي نقاط توقف، أو يراقبها في الكود الأصلي.

الأصلي Native (متوفر فقط مع أكواد C / C ++)

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

بشكلٍ إفتراضي، يقوم LLDB بفحص الكود الأصلي فقط، ويتجاهل نقاط التوقف في كود الجافا الخاص بك. إذا رغبت أيضاً في

تصحيح أكواد الجافا، فيجب عليك التبديل إما إلى نوع التصحيح التلقائي أو التصحيح المزدوج.

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

  • الجهاز يدعم 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.

لمعرفة كيفية تشغيل موجّه أوامر ADB اطلع على الفيديو التالي:

 

المزدوج Dual (متوفر فقط مع أكواد C / C ++)

حدد نوع التصحيح المزدوج، في حال أردت التبديل بين تصحيح كلٍ من، أكواد جافا والكود الأصلي. يقوم اندرويد ستوديو بربط

مصحح أخطاء الجافا و LLDB بعملية تطبيقك، أحدهما لمصحح أخطاء جافا والآخر لمصحح LLDB، بحيث تتمكن من

فحص نقاط التوقف، في كلٍ من كود جافا والكود الأصلي، دون الحاجة لإعادة تشغيل التطبيق أو تغيير تكوين مصحح الأخطاء.

في الشكل 2، لاحظ علامتي التبويب على يمين عنوان نافذة Debug. لأن التطبيق يحتوي على كلٍ من كود Java وكود C ++، فإن إحدى علامات التبويب مخصصة لتصحيح الكود الأصلي، والآخرى لتصحيح أخطاء Java البرمجية، كما هو مشار إليه بواسطة علامة تبويب java-.

الشكل 2. علامة تبويب لتصحيح الكود الأصلي وعلامة تبويب لتصحيح كود جافا.

ملاحظة: إذا كنت تقوم بتصحيح الأكواد الأصلية التي تم تحسينها بواسطة المحول البرمجي compiler، فقد تتلقى رسالة التحذير التالية:

This function was compiled with optimizations enabled. Some debugger features may not be available.

عند إستخدام أعلام التحسين، مثل O flags-، يقوم المحول البرمجي بإجراء تغييرات على الأكواد المحوّله، لجعلها تعمل بكفاءة أكثر.

يمكن أن يؤدي ذلك إلى قيام المصحح بالإبلاغ عن معلومات غير متوقعة أو غير صحيحة، لأنه من الصعب على المصحح تعيين الكود المحوّل والمحسّن بالعودة إلى الكود المصدر الأصلي.

لذا، يجب عليك تعطيل عمليات تحسين المحوّل البرمجي أثناء تصحيح الكود الأصلي.

 

إستخدام سجّل النظام log


يقوم سجّل النظام بعرض رسائل النظام أثناء عملية تصحيح تطبيقك. تتضمن هذه الرسائل معلومات من التطبيقات التي تعمل على الجهاز.

إذا أردت إستخدام سجّل النظام لتصحيح تطبيقك، فتأكد من قيام الكود بكتابة رسائل السجّل، وطباعة تتبع المكدس “stack trace”

للقيام بالإستثناءات، أثناء وجود التطبيق في مرحلة التطوير.

 

كتابة رسائل السجل في الكود

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

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

يوضح المثال التالي كيفية إضافة رسائل سجّل، لتحديد ما إذا كانت معلومات الحالة السابقة متاحة أم لا، عند بدء نشاطك:

KOTLIN

import android.util.Log
...
private val TAG: String = MyActivity::class.java.simpleName
...
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 */
        }
    }
}

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);
    }
}
ملاحظة: قم بإزالة رسائل سجّل التصحيح، وإستدعاءات طباعة stack trace من الكود، عندما تكون جاهزاً لنشر تطبيقك. يمكنك القيام بذلك عن طريق تعيين علامة DEBUG ووضع رسائل سجّل التصحيح بداخل عبارات شرطية.

 

عرض سجّل النظام

يمكنك عرض وفرز رسائل تصحيح الأخطاء، ورسائل النظام الأخرى في نافذة السجل Logcat. مثال، يمكنك مشاهدة الرسائل عند

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

لإستخدام logcat، ابدأ عملية تصحيح الأخطاء وحدد علامة التبويب Logcat في شريط الأدوات السفلي، كما هو موضح في الشكل 3.

الشكل 3. نافذة Logcat مع إعدادات الفرز.

للحصول على وصف لـ logcat وخيارات الفرز الخاصة به، راجع كتابة وعرض السجلات بإستخدام Logcat.


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات

اترك رد