الرئيسيةالمدونة

كيف تنقّحون الأخطاء (debugging) أثناء البرمجة؟

21/05/2020

كيف تنقّحون الأخطاء (debugging) أثناء البرمجة؟ خصوصًا في PHP، ولا مانع من ذكر تجارب في لغات أخرى. هل أنتم مثلي، تستخدمون جمل الطباعة فقط أو في أحسن الأحوال ()var_dump؟ أم أن هناك تقنيات وحيل مفيدة بهذا الصدد؟

أخبروني كل ما تعرفونه عن الdebugging..

سألت هذا السؤال في عدة مواقع، كما فعلت في تدوينتين سابقتين وهما "ما الوقت المناسب لتعلم إطار العمل؟" و"بين الفكرة والبدء بالتكويد.. أسئلتي وإجابتهم". وأرجو أن تفيدكم. ذكرت من الإجابات التي شدّت انتباهي وابتعدت عن التكرار مع شكري الكبير لكل من قدّم يد المساعدة وكتب إجابة، تصرّفت قليلا في تنسيق الإجابات حتى تتضح للقارئ، وترجمت -بتصرّف- إجابات من مجموعة Mena Devs على Slack.

كما أؤكد أن هذه الأجوبة ستحذف إن أراد أصحابها ذلك.

كانت هناك إجابات في تويتر اخترت منها:

@MrSalsa13:

أنا أستعمل console.log في Node.js .. وأعلم بأن ذلك خاطئ لأنه يوجد ال inspect-- الذي يقوم بتتبع الأسطر البرمجية ويمكن عمل break في أي نقطة تظن أنه هناك يكمن الخطأ حتى معرفة سببه .. أظن أني سأعتمد عليه مستقبلا إن شاء الله.

وفي حسوب IO:

Tarek Boublat:

بالإضافة للطريقة التي ذكرتها وهي:

1- محاولة تتبع جميع قيم المتغيرات الموجودة خاصة لو كان ممكن تنفيذ الكود سطر سطر حتى النهاية.

2- حاول استعمال الدوال قدر الإمكان بهذه الطريقة يمكنك تقسيم الكود لوحدات صغيرة وبالتالي يمكنك تتبع الأخطاء.

3- قراءة الكود بتأني وأكثر من مرة.

بالنسبة لي إذا لم تنجح هذه الطرق الثلاثة أقوم بمسح الكود وكتابته بطريقة مختلفة.

وفي فيس بوك، (على مجموعة الزيرو) اخترت هذه الإجابة:

Ammar Hassan: 

أستخدم VS Code مع الإضافة الخاصة بXdebug لـ php. واجهت مشاكل أتبعتني وقت التثبيت فقط. ولكن بعدها اشتغلت بدون مشاكل، وهي ومريحه جدًا صراحة.

وفي كوورا

محمد أشرف (Mohamed Ashraf):

كنت فعلاً أستخدم مجرد طباعة جملة بسيطة أو var dump، لكن أمس جربت استخدام xdebug وحقاً كانت التجربة رائعة.

أصبح الdebugging أكثر سهولة.

XDebug: إضافة للغة php توفر إمكانية التنقيح debugging وتتبع الخطأ لمعرفة مكانه (stack trace) وتحسّن ناتج دالة var_dump.

بعد تثبيتها تظهر الأخطاء بوضوح أكثر: تظهر الخطأ بمربعات، ومكان الملف، والدالة التي حدث فيها، واستطعت -بفضل هذه الإضافة- وضع breakpoints وتتبّع قيم المتغيرات دون الحاجة لطباعتها. أخيراً أمكنني إجراء الdebugging في php.

هذا ما جربته حتى الآن فكما قلت لم أجربها سوى أمس.

يمكنك تثبيت XDebug باتباع الخطوات في هذه المقالة: Debug PHP In VSCode With XDebug | Code Wall.

إن لم تكن تستخدم visual studio code فتوقف عند خطوة configuring VSCode to use php xdebug (في المقال) وابحث عن طريقة استخدامها في بيئة التطوير IDE التي تستخدمها.

وفي مجموعة Slack التي يمكن التسجيل فيها عبر هذا الرابط

أجاب Joe:

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

لغة PHP على سبيل المثال، لديها في نسخها الحديثة على الأقل منقّح مدمج

About debugging in PHP.

اقض ساعة من نهار في تعلم استخدامه، حتى تصبح متأقلمًا معه. سيسهّل من حياتك.

أما في جانب العقلية التي عليك اعتمادها، شيئان ساعدانني مساعدة هائلة: 

1- حاول إعادة إنتاح الخطأ بأقل عدد من أسطر الأكواد البرمجية. اعزل المشكلة واحذف كل الأسطر البرمجية التي لا علاقة لها بالمشكلة. بعض الناس يسمي هذه الطريقة SSCCE. وهي اختصار يشرح وجوب أن تكون المشكلة الواجب حلها (أو التي ستعرضها للآخرين لطلب المساعدة): قصيرة (Short)، مستقلة أو مكتفية ذاتيًا (Self Contained)، صحيحة وقابلة للترجمة برمجيًا عبر الكومبايلر (Correct [Compilable])، موضّحة بمثال للمشكلة المطلوب حلها (Example). المزيد عن هذه الطريقة في هذا الرابط.

2- استخدم طريقة (تصحيح البطة المطاطية)، وتعني شرح الكود تفصيليًا لدمية وكأنت تشرحه لإنسان بجوارك. هذه الطريقة لا تعمل وحسب، بل تعمل جيدًا بحق. عندما تعلق في حل مشكلة برمجية، اشرح هذه المشكلة بصوت عالٍ لبطتك المطاطيّة. ستتفاجأ من فعالية هذا الأسلوب.

وأجاب saeidw:

لدى PHP أيضًا منقّح Xdebug وهو منقّح أخطاء رائع يدعم أشياء مثل: التنقيح عن بعد عبر سيرفر.

لم أستخدم -شخصيّا- منقح داخلي مدمج في لغة PHP ولكن من الجيد معرفة وجوده!

ولكن، نعم، كما قال Joe: المنقّح هو صديقك، ومن خبرتي الشخصية، إذا كمنت قادرًا على تشغيل المنقّح، ستستطيع حل المشاكل البرمجية بسرعة تقدّر بـ 40% أو أكثر.

كذلك، لن تصدّق كم هو مفيد استخدام التخطيط بالورقة والقلم لحل هذه المشاكل.

وشيء آخر جميل في PHP لم أر أي أحد يستخدمه:  varexport() والتي تعمل مثل دالة vardump() ولكنها ترجع النتيجة كنص يمكنك استخدامه في تنقيح أخطاء السجل كما في هذا السطر البرمجي: 

;errorlog("The variable x is: " . varexport($x, true))

وبقية الإجابات كلها سواء في ليندكن أو غيره تتحدث عن Xdebug.

أرجو أن تكونوا استفدتم من هذه التدوينة والشكر موصول لكل من قدّم إجابة..

إذا كنت تعرف طريقة في تنقيح الأخطاء أو إضافة/برنامج معيّن لتنقيح الأخطاء فلا تتردد في كتابته في تعليق.

2021