نقاط التوقف لتصحيح أخطاء التطبيق

الإعلانات

التعامل مع نقاط التوقف

 

يدعم اندرويد ستوديو عدة أنواع من نقاط التوقف التي تؤدي إلى تشغيل إجراءات تصحيح مختلفة.

النوع الأكثر شيوعاً هو نقاط التوقف السطريه، التي تقوم بإيقاف تنفيذ التطبيق مؤقتاً، عند سطر محدد من الكود.

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

لإضافة نقطة توقف سطريه، اتبع ما يلي:
  1. حدد موقع سطر الكود الذي تريد إيقاف التنفيذ مؤقتاً عنده، ثم انقر فوق المجرى الأيسر المحاذي لهذا السطر من الكود، أو ضع علامة الإقحام “^” على السطر ثم أضغط على Control + F8 (على ماك Command + F8).
  2. إذا كان تطبيقك يعمل بالفعل، فلن تحتاج إلى تحديثه لإضافة نقطة الإيقاف – فقط انقر فوق Attach debugger to Android proccess. وإلا، ابدأ بتشغيل وضع تصحيح الأخطاء بالنقر فوق Debug.

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

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

الموجودة في علامة التبويب Debugger لتحديد حالة التطبيق:

  • لفحص شجرة الكائن لمتغيرٍ ما، قم بتوسيعه في معاينة Variables. إذا لم تكن معاينة Variables مرئية، فانقر فوق Restore Variables View.
  • لتقييم التعبير الموجود عند نقطة التنفيذ الحالية، انقر فوق Evaluate Expression.
  • للتقدم إلى السطر التالي في الكود (بدون إدخال الدالة)، انقر فوق Step Over.
  • للتقدم إلى السطر الأول بداخل إستدعاء الدالة، انقر فوق Step Into.
  • للتقدم إلى السطر التالي إلى خارج الدالة الحالية، انقر فوق Step Out.
  • لمتابعة تشغيل التطبيق بشكلٍ طبيعي، انقر فوق Resume Program.

إذا كان مشروعك يستخدم أي أكواد أصليه، فإن نوع التصحيح التلقائي Auto يقوم بربط كلٍ من مصحح Java و LLDB إفتراضياً

بتطبيقك، كعمليتين منفصلتين، بحيث يمكنك التبديل بين فحص نقاط توقف Java و C / C ++ من دون إعادة تشغيل التطبيق أو تغيير الإعدادات.

ملاحظة: لكي يكتشف اندرويد ستوديو، نقاط التوقف في كود C أو ++C، يجب عليك إستخدام نوع تصحيح يدعم LLDB، مثل التصحيح التلقائي Auto أو الأصلي Native أو المزدوج Dual.

يمكنك تغيير نوع التصحيح الذي يستخدمه اندرويد ستوديو، من خلال تحرير تكوين التصحيح. لمعرفة المزيد حول أنواع التصحيح المختلفة، اقرأ

القسم الخاص بإستخدام أنواع التصحيح الأخرى.

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

الشكل 4. تصحيح الكود الأصلي بإستخدام LLDB.

1. يقوم اندرويد ستوديو بالتبديل إلى علامة التبويب <your-module> عندما يواجه مصحح أخطاء LLDB، نقطة توقف في أكواد C++ / C.

كما تتوفر أيضاً ألواح Frames و Variables و Watches و تعمل تماماً كما لو كنت تقوم بتصحيح كود Java.

على الرغم من أن لوح التسلسلات Threads pane غير متوفر في عرض جلسة LLDB، إلا أنه يمكنك الوصول إلى عمليات

تطبيقك بإستخدام القائمة المنسدلة في لوح Frames.

يمكنك معرفة المزيد حول هذه الألواح، في الأقسام التي تتحدث حول كيفية تصحيح إطارات النوافذ و فحص المتغيرات.

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

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

توقف في الكود الأصلي.

2. يقوم اندرويد ستوديو بالتبديل إلى علامة التبويب your-module>-java> عندما يواجه مصحح أخطاء جافا، نقطة توقف في كود جافا الخاص بك.

3. أثناء تصحيح الأخطاء بإستخدام LLDB، يمكنك إستخدام LLDB terminal في عرض جلسة LLDB، لتمرير خيارات سطر الأوامر إلى LLDB.

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

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

أثناء تصحيح أخطاء أكواد C++ / C، يمكنك أيضاً، تعيين أنواع خاصة من نقاط التوقف، تسمى نقاط المراقبة، والتي يمكنها تعليق

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

 

عرض وتكوين نقاط التوقف

لعرض جميع نقاط التوقف، و تكوين إعداداتها، انقر فوق  View Breakpoints على الجانب الأيسر من نافذة Debug. سوف تظهر

نافذة Breakpoints، كما هو موضح في الشكل 5.

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

تتيح لك نافذة نقاط التوقف Breakpoints، تمكين أو تعطيل كل نقطة توقف، من القائمة الموجودة على اليسار. إذا تم تعطيل نقطة

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

اختر نقطة توقف من القائمة، لتكوين إعداداتها. يمكنك تكوين نقطة توقف لتعطيلها في البداية، وجعل النظام يقوم بتمكينها، بعد الوصول إلى نقطة توقف مختلفة.

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

التوقف Exception Breakpoints في قائمة نقاط التوقف.

 

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

في نافذة المصحح Debugger، يتيح لك لوح الإطارات Frames فحص إطار الكومة، الذي تسبب في الإرتطام بنقطة التوقف الحالية.

يسمح لك هذا، بالتنقل وفحص إطار الكومه، وكذلك فحص قائمة التسلسلات Threads في تطبيق اندرويد. لتحديد تسلسل،

إستخدم محدد التسلسل المنسدل، و أعرض إطار الكومه الخاص به.

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

الكومه كما تمت مناقشته في دليل إطارات النوافذ.

 

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


في نافذة Debugger، يتيح لك لوح Variables فحص المتغيرات، عندما يوقف النظام تطبيقك عند نقطة توقف، وعند إختيارك لإطار من لوح Frames.

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

يوفر لوح Watches وظائف مماثلة، إلا أن التعبيرات التي تمت إضافتها إلى لوح Watches لا تزال قائمة بين جلسات تصحيح الأخطاء.

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

تظهر ألواح Variables و Watches كما هو موضح في الشكل 5.

لإضافة متغير أو تعبير إلى قائمة Watches، اتبع الخطوات التالية:

  1. ابدأ التصحيح.
  2. في لوح Watches، انقر فوق Add.
  3. في مربع النص الذي يظهر، اكتب اسم المتغير أو التعبير الذي تريد مراقبته، ثم اضغط Enter.
  4. لإزالة عنصر من قائمة Watches، حدد العنصر ثم انقر فوق Remove.
  5. يمكنك إعادة ترتيب العناصر، في قائمة Watches من خلال تحديد عنصر ثم النقر فوق Up أو Down.

الشكل 6. ألواح المتغيرات والمراقبة في نافذة المصحح

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

أثناء تصحيح كود C++ / C، يمكنك تعيين أنواع خاصة من نقاط التوقف، تسمى نقاط المراقبة، والتي يمكنها تعليق عملية تطبيقك،

عندما يتفاعل مع جزء معين من الذاكرة.

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

الذاكرة هذا، يؤدي إلى تشغيل نقطة المراقبة.

في اندرويد ستوديو، يمكنك إنشاء نقطة مراقبة أثناء وقت التشغيل، عن طريق تحديد متغير معين، ولكن LLDB يقوم بتعيين نقطة

المراقبة، فقط إلى جزء الذاكرة الذي يخصصه النظام لهذا المتغير، وليس المتغير نفسه.

يختلف هذا عن إضافة متغير إلى لوح Watches، والذي يمكّنك من ملاحظة، قيمة المتغير، ولكنه لا يسمح لك بتعليق عملية

التطبيق، عندما يقرأ النظام أو يغير قيمتها في الذاكرة.

ملاحظة: عندما تخرج عملية التطبيق من وظيفةٍ ما، و عندما يقوم النظام بإلغاء تخصيص متغيراتها المحلية من الذاكرة، فسوف تحتاج إلى إعادة تعيين أية نقاط مراقبة، قمت بإنشائها لتلك المتغيرات.
لتعيين نقطة مراقبة، يجب أن تفي بالمتطلبات التالية:
  • الجهاز الفعلي المستهدف أو المحاكي، يستخدم (CPU) وحدة معالجة مركزية x86 أو x86_64.

إذا كان جهازك يستخدم وحدة المعالجة المركزية ARM CPU، فيجب عليك محاذاة حدود “عنوان المتغير” في الذاكرة، إما إلى 4 بايت لمعالجات 32 بت، أو 8 بايت لمعالجات 64 بت.

يمكنك محاذاة متغير في الكود الأصلي عن طريق تحديد (((attribute__((aligned(num_bytes__ في اعلان المتغير variable

deceleration، كما هو موضح أدناه:

// For a 64-bit ARM processor
int my_counter __attribute__((aligned(8)));
  • إذا قمت بالفعل بتعيين ثلاث نقاط مراقبة أو أقل. يدعم اندرويد ستوديو ما يصل إلى أربع نقاط مراقبة فقط، على الأجهزة المستهدفة x86 أو x86_64. قد تدعم الأجهزة الأخرى نقاط مراقبة أقل.
إذا استوفيت المتطلبات المذكورة أعلاه، يمكنك إضافة نقطة مراقبة على النحو التالي:
  1. أثناء تعليق تطبيقك بسبب نقطة توقف، انتقل إلى لوح المتغيرات Variables في عرض جلسة LLDB.
  2. انقر بزر الماوس الأيمن فوق متغير يكمن في جزء الذاكرة، التي تريد تتبعها، ثم حدد Add Watchpoint. يظهر مربع حوار لتكوين نقطة المراقبة الخاصة بك، كما هو مبين في الشكل 7.

الشكل 7. إضافة نقطة مراقبة إلى متغير، في الذاكرة.

3. قم بتكوين إعدادات نقطة المراقبة كما يلي:

    • ممكّن Enabled: يمكنك إلغاء تحديد هذا الخيار، إذا كنت أردت إخبار اندرويد ستوديو، بتجاهل نقطة المراقبة في الوقت الحالي.

لا يزال اندرويد ستوديو يحتفظ بنقطة المراقبة، لكي تتمكن من الوصول إليها لاحقاً في جلسة تصحيح الأخطاء.

    • معلّق Suspend: يقوم نظام اندرويد إفتراضياً بتعليق عملية التطبيق، عندما يصل إلى جزء من الذاكرة قمت بتعيينه لنقطة مراقبة.

يمكنك إلغاء تحديد هذا الخيار، إذا لم ترغب في هذا السلوك – وهذا يُظهر خيارات إضافية، يمكنك إستخدامها لتخصيص السلوك، عندما يتفاعل النظام مع..

نقطة المراقبة الخاصة بك: Log message to console و Remove [the watchpoint] when hit.

    • نوع الوصول Access Type: حدد ما إذا كان يجب على تطبيقك تشغيل نقطة المراقبة، عندما يحاول القراءة Read أو

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

4. انقر فوق تم Done.

لعرض كافة نقاط المراقبة، وتكوين إعدادات نقطة المراقبة، انقر فوق View Breakpoints على الجانب الأيسر من نافذة Debug.

يظهر مربع الحوار Breakpoints، كما هو موضح في الشكل 8.

الشكل 8. مربع الحوار Breakpoints يسرد نقاط المراقبة الحالية، كما يتضمن إعدادات السلوك لكلٍ منها.

بعد إضافة نقطة المراقبة، انقر فوق Resume Program على الجانب الأيسر من نافذة Debug لإستئناف عملية التطبيق.

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

عملية التطبيق، وتظهر أيقونة نقطة المراقبة ، بجوار سطر الكود، الذي تم تنفيذه من قِبل تطبيقك مؤخراً، كما هو موضح في الشكل 9.

الشكل 9. اندرويد ستوديو يشير إلى سطر الكود الذي نفذه تطبيقك للتو، قبل تشغيل نقطة المراقبة.

 

عرض وتغيير صيغة “عرض قيمة المصدر”


في وضع التصحيح، يمكنك عرض قيم المصادر، وتحديد صيغ عرض مختلفة، للمتغيرات في كود الجافا. بعد عرض علامة التبويب Variables وتحديد إطار، قم بما يلي:

  1. في قائمة المتغيرات Variables، انقر بزر الماوس الأيمن في أي مكان على سطر المصدر، لعرض القائمة المنسدلة.
  2. في القائمة المنسدلة، حدد View as وحدد الصيغة التي تريد إستخدامها.

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

  • الفئة Class: تعرض تعريف الفئة.
  • إلى سلسلة toString: تعرض صيغة السلسلة.
  • كائن Object: يعرض تعريف الكائن (مثيل\نسخة لفئة).
  • مصفوفة Array: تعرض في صيغة مصفوفة.
  • الطابع الزمني Timestamp: يعرض التاريخ والوقت كما يلي: yyyy-mm-dd hh: mm: ss.
  • تلقائي Auto: يختار اندرويد ستوديو أفضل صيغة بناءً على نوع البيانات.
  • ثنائي Binary: يعرض قيمة ثنائية بإستخدام الأصفار 0 و الواحد 1.
  • قياس المواصفات MeasureSpec: القيمة التي تم تمريرها من الأصل إلى الفرع المحدد. راجع MeasureSpec.
  • سداسي عشري Hex: يعرض كقيمة ست عشرية.
  • البدائي Primitive: يعرض كقيمة رقمية بإستخدام نوع البيانات البدائية.
  • عدد صحيح Integer: يعرض قيمة رقمية من نوع عدد صحيح Integer.

يمكنك إنشاء صيغه مخصصة (عارض نوع البيانات\data type renderer)، كما يلي:

  1. انقر بزر الماوس الأيمن فوق قيمة المصدر .
  2. حدد View as.
  3. حدد Create. يظهر مربع الحوار Java Data Type Renderers.
  4. اتبع الإرشادات الموجودة في عارض نوع بيانات جافا.

 


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

الإعلانات

اترك رد