قبل كتابة شيفرات برمجية أكثر تعقيدا، لنتطرَّق إلى تنقيح الأخطاء.
تنقيح الأخطاء هي عملية إيجاد الأخطاء في السكريبت وإصلاحها. تدعم جميع المتصفحات الحديثة وبعض البيئات الأخرى "تنقيح الأخطاء" -واجهة مستخدم خاصة في أدوات المطور والتي تجعل العثور على الأخطاء وتصحيحها أمرا سهلا. تُتيح هذه الواجهة أيضا تَتَبُّع الأكواد خطوة بخطوة لمعرفة ما يحدث فيها بالتفصيل.
سنستخدم Chrome لأن لديه ميزات كافية لذلك، كما تتوفر هذه الميزات في معظم المتصفحات الأخرى.
جزء الموارد "sources"
قد يبدو إصدار Chrome لديك مختلفًا بعض الشيء، إلا أن المحتوى هو ذاته.
- افتح صفحة example في Chrome.
-
شغِّل أدوات المطور بالضغط على
F12
(على أجهزة Mac، استعمل الاختصارCmd+Opt+I
). -
اختر الجزء
sources
.
إن كانت هذه هي مرتك الأولى للدخول إلى جزء sources
، فهذا ما ستراه:
يفتح هذا الزر علامة تبويب تحوي الملفات.
اضغط عليها واختر hello.js
من العرض الشجري "tree view". يجب أن ترى التالي:
هنا يمكننا رؤية ثلاث مناطق:
- منطقة الموارد "Resources zone" والتي تعرض ملفات HTML، و JavaScritp، و CSS، وغيرها من الملفات بما في ذلك الصور المُلحقة بالصفحة. قد تظهر إضافات Chrome هنا أيضًا.
- منطقة المصدَر "Source zone" والتي تعرض الشيفرة البرمجية المصدرية.
- منطقة المعلومات والتحكم "Information and control zone" لتنقيح الأخطاء، سَنكتشفها أكثر فيما يلي
يمكنك الضغط على الزر مُجددًا لِإخفاء قائمة الموارد وإعطاء الشيفرة البرمجية مساحة كافية.
شاشة التحكم (Console)
تظهر شاشة تحكم عند الضغط على Esc
. يمكن كتابة الأوامر في شاشة التحكم ثم الضغط على Enter
لتنفيذها.
تظهر مخرجات تنفيذ أمر ما أسفله مباشرة في شاشة التحكم.
مثال: كما في الصورة بالأسفل 1+2
ينتج 3
، بينما hello("debugger")
لا يُظهِر أي نتائج، لذلك فإننا نرى undefined
:
نقاط التوقف (Breakpoints)
لنختبر ما يحدُث أثناء تنفيذ الشيفرة البرمجية في صفحة example. في الصفحة hello.js
، اضغط على السطر رقم 4
؛ نضغط على الرقم ذاته وليس السطر.
هكذا تكون قد أنشأت نقطة توقف. اضغط على الرقم 8 أيضًا. يجب أن يبدو الشكل كما في الصورة التالية:
نقطة التوقف هي نقطة يتوقف فيها مصحح الأخطاء عن تنفيذ JavaScript تلقائيًا.
يمكننا فحص المتغيرات الحالية وتنفيذ الأوامر أو أي شيء آخر في لوحة التحكم أثناء توقف عمل الشيفرة البرمجية. أي أنه يمكننا تتبع الشيفرة البرمجية عند نقطة معينة عبر ايقافها والتأكد من أي شيء فيها كما نريد.
يمكننا رؤية قائمة بالعديد من نقاط التوقف في الجزء الأيمن من الشاشة. يكون الأمر مفيدًا عند وجود عدة نقاط توقف في أكثر من ملف، وذلك يتيح لنا:
- التنقل بسرعة إلى نقاط التوقف في الشيفرة البرمجية (بالضغط عليها من الجزء الأيمن).
- إلغاء تفعيل نقاط التوقف مؤقتا بإلغاء تحديدها.
- حذف نقطة التوقف بالضغط عليها باليمين واختيار حذف "remove".
- وهكذا …
نقاط التوقف الشرطية
يتيح لك الضغط يمينَا على رقم السطر إنشاء نقطة توقف شرطية تُنَفَّذ عند تحقق الشرط المحدد فقط.
يكون ذلك مفيدَا عندما تريد إيقاف التنفيذ لمعرفة قيمة أي متغير أو قيمة أي معامل في دالة.
أمر Debugger
يمكن أيضا إيقاف تنفيذ الشيفرة البرمجية بوضع الأمر debugger
فيه كما يلي:
function hello(name) { let phrase = `Hello, ${name}!`; debugger; // <-- يتوقف المنقح هنا say(phrase); }
هذه الطريقة سهلة عندما نُعدِّل الشيفرة البرمجية باستخدم محرر الشيفرات البرمجية ولا نريد الانتقال إلى المتصفح وتشغيل السكربت في وضع أدوات المطور لإنشاء نقاط توقف.
توقف وتحقق
في المثال، يتم استدعاء الدالة hello()
أثناء تحميل الصفحة، لذلك فإن أسهل طريقة لتفعيل مُنقِّح الأخطاء (بعد إعداد نقاط التوقف) هي إعادة تحميل الصفحة. اضغط على F5
(لمستخدمي ويندوز أو لينكس)، أو اضغط على Cmd+R
(لمستخدمي Mac).
سيتوقف تنفيذ الشيفرة البرمجية في السطر الرابع حيث تم إنشاء نقطة التوقف:
افتح قوائم المعلومات المنسدلة على اليمين (موضحة بأسهم). تتيح هذه القوائم التحقق من حالة السكريبت الحالية:
1- Watch
- تعرض القيم الحالية لأي تعابير.
يمكنك الضغط على +
وإدخال أي تعبير تريده. سيعرض المعالج قيمته في أي وقت وحساب قيمته تلقائيا أثناء التنفيذ.
2- Call Stack
- تعرض سلسلة الاستدعاءات المتداخلة.
في الوقت الحالي، المعالج وصل حتى استدعاء الدالة hello()
، المُستدعاة من خلال السكريبت index.html
(لا يوجد دوال أخرى لذلك سُمِّيَت "anonymous").
إن ضَغَطت على عنصر من الحزمة (stack) مثلا "anonymous"، فسينتقل المعالج مباشرة إلى الشيفرة البرمجية المُمَثِّل لهذا العنصر وستتمكن من فحص جميع متغيراته أيضا.
3- Scope
- تعرض المتغيرات الحالية.
Local
تعرض متغيرات الدالة المحلية. يمكنك أيضا رؤية قيم هذه المتغيرات موضحة على اليمين.
Global
تعرض المتغيرات الخارجية (خارج نطاق أي دالة).
يوجد أيضا الكلمة المفتاحية this
والتي لم تُشرح بعد، لكن سيتم شرحها قريبا.
تتبع التنفيذ
يوجد بعض الأزرار لِتتبع التنفيذ أعلى يمين اللوحة. لِنتطرق إليها.
- زر استمرار التنفيذ F8
.
يستأنف التنفيذ. إن لم توجد أي نقاط توقف، فإن التنفيذ سيستمر بعد الضغط على هذا الزر وسَيفقد مصحح الأخطاء السيطرة على السكريبت.
هذا ما سنراه بعد الضغط عليه:
تم استئناف التنفيذ، ووصل لنقطة توقف أخرى داخل الدالة say()
وتوقف هناك. انظر في Call stack
على اليمين. تم تنفيذ استدعاء آخر. وصل التنفيذ الآن حتى الدالة say()
.
- نفِّذ خطوة (نفّذ الأمر التالي)، لكن لا تنتقل إلى الدالة الأخرى، الوصول السريع F10
.
سيظهر alert
إذا ضغطنا على هذا الزر الآن. الأمر المهم هنا هو أن alert
قد يحوي على أي دالة، لذلك فإن التنفيذ سيتخطاها.
- نفِّذ خطوة، الوصول السريع F11
.
يقوم بنفس آلية عمل الأمر السابق بالإضافة إلى تنفيذ الدوال المتداخلة. سَتتنفذ أوامر السكريبت بالضغط عليه خطوة بخطوة.
- استمر بالتنفيذ حتى نهاية الدالة الحالية، باستخدام الزر Shift+F11
.
سيتوقف التنفيذ عند آخر سطر للدالة الحالية. يكون هذا الأمر مفيدا عند الدخول إلى استدعاء دالة مصادفةَ باستخدام الزر ، لكن تتبع هذه الدالة ليس أمرا مهما، لذلك نقوم بتخطي تتبعها.
- تفعيل/تعطيل جميع نقاط التوقف.
لا يقوم هذا الزر بمتابعة التنفيذ، إنما يُفَعِّل/يُعطِّل كمَا كبيرا من نقاط التوقف.
- تفعيل/تعطيل التوقف التلقائي في حال حدوث خطأ.
عند تفعيله في وضع أدوات المطور، فإن الشيفرة البرمجية تتوقف عن التنفيذ تلقائيا عند أي خطأ في السكريبت. ثم يمكننا تحليل المتغيرات لمعرفة سبب الخطأ. لذلك، إن أوقف خطأ مَا متابعة تنفيذ الشيفرة البرمجية، يمكننا فتح مصحح الأخطاء وتفعيل هذا الخيار وإعادة تحميل الصفحة لرؤية مكان توقف الشيفرة البرمجية وما هو المحتوى عند تلك النقطة.
الاستمرار حتى هنا "Continue to here"
الضغط يمينا على سطر من الشيفرة البرمجية يفتح قائمة السياق المحتوية على خيار مفيد يُدعى "Continue to here".
يكون هذا الخيار مُفيدا عندما نريد التقدم بضع خطوات للأمام بدون وضع نقطة توقف.
التسجيل (Logging)
يمكن استخدام الدالة console.log
لِعرض شيء على الشاشة كمُخرج من الشيفرة البرمجية. مثلا، يعرض الأمر التالي القيم من 0
حتى 4
إلى الشاشة:
// open console to see for (let i = 0; i < 5; i++) { console.log("значение", i); }
لا يرى المستخدم العادي هذه المخرجات. لرؤيتها، افتح علامة التبويب Console
أو اضغط على Esc
إن كنت في علامة تبويب أخرى هكذا تُفتًح الشاشة في الأسفل.
إن كانت الشيفرة البرمجية تحتوي على أوامر console.log
، فسنرى ما يحدث من خلال سجلات التتبع بدون الدخول إلى المُصحح.
الخلاصة
كما رأينا، فإن هناك ثلاث طرائق رئيسية لإيقاف السكريبت:
- باستخدام نقطة توقف.
-
الأمر
debugger
. - وجود خطأ (في حال كانت أداوت المطور مفتوحة وكان الزر مُفَعًّلَأ).
عند توقف السكريبت، يمكننا فحص المتغيرات وتتبع الشيفرة البرمجية لرؤية أي أخطاء.
يوجد العديد من الخيارات الأخرى في أدوات المطور أكثر مما تم شرحه سابقا. تجد الدليل كاملا على https://developers.google.com/web/tools/chrome-devtools.
تُعَد المعلومات التي وُضِعَت كافية لبدء تتبع أي شيفرة برمجية وتنقيحها، لكنك ستحتاج للاطلاع على الدليل لاحقا لتعلم ميزات متقدمة في أدوات المطور، خاصة إن كنت تتعامل كثيرا مع المتصفح.
يمكنك الضغط على عدة أماكن في أدوات المطور ورؤية ما يحدث. تُعد هذه أفضل طريقة لتعلم أدوات المطور. لا تنسَ الضغط يمينا وتجريب قوائم السياق.
ترجمة -وبتصرف- للفصل Debugging in Chrome من كتاب The JavaScript Language.
اقرأ أيضًا
- المقال التالي: نمط كتابة الشيفرة
- المقال السابق: مراجعة لما سبق
أفضل التعليقات
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.