الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الآن أضف لموقعك debug لكي تستمتع بإلتقاط الأخطاء بسهولة

مغلق
بدأه أبو محمد اللحياني في 25 أكتوبر 2006 · 7 رد · 1,047 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

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

فأحياناً يكون البرنامج ليس فيه خطأ من ناحية الصياغة اللغوية وأيضاً خالٍ من الأخطاء القاتلة التي تتعلق بالتعامل بمصادر البيانات , ولكنه يعطي نتائج غير متوقعة بسبب بعض الهنات هنا وهناك يغفل عنها المبرمج .

ولذلك لجأ الكثير منهم بإضافة ( debuging ) وتعني - كما أفهم من التطبيق وليس من الترجمة - : تتبع أخطاء البرنامج ومعرفة مصدر الخطأ من أين بسرد كل متغيرات البرنامج ونتائج الإجراءات .

ويهدف هذا الموضوع عرض الأخطاء مع عرض كل متغيرات البرنامج ونتائج الإجراءات يعني سير البرنامج ككل وبأخطاءه إن وجدت.

أما بنسبة لعرض الأخطاء الصادرة عن بيئة PHP فقد سبق في هذا المنتدى موضوع للأستاذ : الحسين علي المشرف السابق وبعنوان : (تعقب الأخطاء error tracing, إسلوب أفضل لعرض الأخطاء) وهو يتحدث عن إظهار الأخطاء بمظهر يساعد على تصحيحها وهو جهد مشكور وغير مسبوق إليه فجزاه الله خيراً .

ولقد استفدت منه كثيراً وأدخلته ضمن الملفات مع بعض التعديلات الطفيفة .

/index.php?showtopic=49409

وأما بنسبة لعرض متغيرات ونتائج الإجراءات فاستخدمت دوال من موقع Zend

http://www.zend.com/zend/tut/tutorial-Debu...nc=0&view=1

http://www.zend.com/codex.php?id=876&single=1

ثم استخلص هذه الدالة البسيطة في فكرتها debug_var .

وتكمن الفكرة بإضافة الدالة debug_var عند كل ما تريد مراقبته وتأخذ وسيطين (arguments) اسم المتغير الذي تريده أن يظهر باسمه لتميزه عن غيره، والثاني قيمته التي تريد معرفتها .

مثال :

debug_var ('SESSION', $_SESSION);

س: إذاً ستفضحنا هذه الدالة وستظهر أسرارنا أمام الملأ ؟؟

هذه وظيفتك أيها المبرمج ، وهذه الدالة لا تعمل إلا إذا طلبت منها العمل حيث تفحص قيمة متغير عام في البرنامج ( $HAS_DEBUG ) أنت من تحدد قيمته مثال :

$HAS_DEBUG = $_GET['debug'] ? $_GET['debug'] : 0;

أوما شابه ذلك كل مبرمج بطريقته . وإذا جعلتها تعمل بدون فحص المتغير فإنه لا شك ستبطئ عمل البرنامج وأنت لا يحتاج إليها كل وقت .

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

هذه الدالة لما تبدأ في تسجيل الأخطاء والمتغيرات فإنها لا تنتظر حتى ينتهي البرناج كي تعرض نتيجة عملها وإنما تبدأ بإنشاء الملف debug.html عند بداية البرنامج وتسجل كل خطأ فيه عن طريق فتحة كل مره والإلحاق فيه .

فإذا توقف البرنامج عند خطأ فإنك ستعرف أين هو - وهذا هو بيت القصيد والمهم في الموضوع - فعند استعراض الملف debug.html يظهر آخر فحص لها والخطأ يكون بعدها مباشرة .

س: إذاً ستتراكم الأخطاء والمتغيرات عند كل مرة تفتح الصفحة وسيتضخم حجم الملف ؟

ج: تجاوت الدالة هذه المشكلة بفحص متغير $debugCount حيث تكون قيمة بداية الصفحة صفر ( 0 ) وعندها ستكتب على بيانات الملف السابق بهذ الاسم ثم تزيد العداد $debugCount++; وبعدها تلحق المدخلات آخر الملف .

س: إلى أي مدى يمكنني معرفته عن برنامجي ؟ ! ؟

ج: كل شيء وهذا يتطلب بعض الخبرة بدوال php فستطيع أن تراقب المصفوفات ، الكائنات ( class ) ، الدوال ، متغيرات البيئة ، وغيرها .

وهذا مسرد بما هو مهم منها :

get_included_files // تسرد لك جميع الملفات التي استخدمتها

get_magic_quotes_gpc // هل حماية الرموز بالشرطات مفعل

method_exists // ما هي نتيجة عمل الإجراء ضمن كائن معين

func_get_args // مسرد بالبرامترات وقيمها

get_object_vars // تسرد لك جميع متغيرات الكائن على شكل مصفوفة

get_declared_classes // لا يفيدك كثيراً فهو يعطيك كل الكائنات حتى التي في بيئة php ولم تستخدمها

get_defined_functions // أيضاً لا يفيد كثيراً إلا إذا حدد [user] يعني التي أنت صرحت بها

memory_get_usage // لم يعمل معي ويعطيك حجم الذاكرة المستخدمة وهنا بديل عنه باستخدام getmypid(); راجع ملفات المساعدة لـ memory_get_usage

apache_request_headers // مسرد بالرؤوس المرسلة من المتصفح

تنبيه الدالة error_log تقوم بعمل الدالة debug_vars ولكنها لا تتيح لك المراقبة المتكاملة ولكنها تصلح أن تستخدمها بعد الإنتهاء من البرمجة وتعمل دوماً وبلا شرط في الأخطاء القاتلة والحرجة يعني ممكن أن تضيفها في موقع إنتاجي للدالة CustomErrorHandler إذا كان الخطأ حرجاً يعني ليس ملاحظة أو تحذير أو خطأ إعرابي .

وإذا استخدمت error_log فإن لها خيارات بإرسال الخطأ إلى بريد أو إلى ملف أو إلى موقع .

هذه أكثر الدوال المهمة التي تتعلق بمراقبة سير البرنامج وهنا معلومات تستطيع معرفتها عن استعراض الملف phpinfo.php المعروف .

وأرجوا من الأخوان أن يدلونا على دوال أخرى مهمة ، أو طرائق جديدة .

في المرفقات : مثال مع بعض الهدايا العيدية ويحتوي على الملفات التالية :

كائن بسيط للإتصال بقاعدة بيانات mySQL والتعامل معه

كائن نظام القوالب TemplatePower مع مثال عليه وكيف نستخدم debug معه .

الملف : customerrorviewer.php للاستاذ الحسين علي بارك الله فيه، مع بعض التعديلات الطفيفة عليه .

الملف : function.php وبه بعض الدوال المتعلقة بالمثال .

وملف index.php الذي تستطيع أن تعبث به كما شئت لكي تسبر أغوار هذه الطريقة .

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

debug.zip

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 25 أكتوبر 2006 في 01:29

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#3

شكرا أبو محمد على الموضوع

ممكن نلقى نظرة كمان على XDebug

Web Citizen

ShrefInLife.gif

__________

General blog : Shref In Life

#4

السلام عليكم ورحمة الله وبركاته

أخي فواز

أخي الشريف

جزاكم الله خيراً على مروركم واهتمامكم ولنفتح النقاش لتعم الفائدة للجميع

Xdebug مشروع جميل وضخم وحملت الإصدار الثاني وعندي الإصدار PHP Version 5.0.4 ولكن أخطأت في تثبيتها في جهازي ولكن لم تعمل دوالها :

ولما نفذت الكود التالي :

debug_var ('declared_classes', get_declared_classes());
debug_var ('get_defined_functions', get_defined_functions());

لم أجدها هي ولا دوالها .

وذكروا تنبيه أنها لا تظهر في معلومات ملف phpinfo.php ولكن يجب عليه أن يستخدمها مع الإجراء set_error_handler ولكني لم أعرف كيف .

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 27 أكتوبر 2006 في 02:56

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#5

عذراً قد استعجلت في الرد ولم أضبط إعدادتها تماماً .

لما حملتها أول مرة من هنا http://xdebug.org/link.php?url=xdebug200rc1-512-win ولم تعمل معي

و الآن حملتها منهنا http://pecl4win.php.net/ext.php/php_xdebug.dll

وقد عملت وهي رائعة

ولكن عندي سؤال: هذه module قد لا تثبتها شركات الإستضافة ؟ فكيف نتجاوز هذه المشكلة .

الحل هو استخدام ما ذكرته في اول الموضوع وإن كان حل لا يقارن مع Xdebug

أيضاً استخدام Xdebug في السيرفر المحلي هو مكانها الأولى بها وهي سرعة الحصول على معلومات حول الخطأ .

والله اعلم .

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#6
أبو محمد اللحياني كتب:
ولكن عندي سؤال: هذه module قد لا تثبتها شركات الإستضافة ؟ فكيف نتجاوز هذه المشكلة .

الحل هو استخدام ما ذكرته في اول الموضوع وإن كان حل لا يقارن مع Xdebug

أيضاً استخدام Xdebug في السيرفر المحلي هو مكانها الأولى بها وهي سرعة الحصول على معلومات حول الخطأ .

والله اعلم .

المفروض ان فى أى مشروع من النوع دة بيكون فى 2 servers , واحد اسمه development server و دة الى بيتم عليه كل الـ testing و الـ debugging , و بعد إنتهاء المرحلة دى و التأكد من أن كل حاجة شغالة تمام , بتنقل نسخة من الملفات الى فيها الكود الى حينفذ المهمة (بدون أى ملفات خاصة بالـ testing ) الى السيرفر الى بيستخدم من قبل المستخدم المستهدف , سواء كان موقع او internal server فى شركة , بيتم تعريفه على انه production server .

إذا حصلت بعد كدة مشكلة مكنش معمول حسابها على الـ production server و احتجت تغير حاجة فى الملفات , فبتقوم بتعديلاتك على الملفات الموجودة فى الـ Dev server و تعمل testing و اتأكد ان كل حاجة تمام , و ابتدى ارفع الملفات المعدلة مكان الملفات المقابلة ليها على الـ production server .

انك تعمل testing أو debugging على production server و المستخدمين كلهم يتفرجوا على الـ errors و الـ stack traces مفتكرش ان دى حاجة انت حتحبها.

بالمناسبة بردو , على الـ production server المفروض متظهرش أى errors للمستخدم , ممكن تنفذ دة عن طريق وضع display_errors = 0 فى ملف php.ini

لو مش متوافرلك دة ممكن فى اول الكود بتاعك تستخدم

ini_set('display_errors', 0);

الأولى ليها الأفضلية زى مموضح فى الـ manual .

Web Citizen

ShrefInLife.gif

__________

General blog : Shref In Life

#7

بارك الله فيك مشرفنا Shreef وأشكرك على توضيح هذه الأمر وما زلت في بدياتي مع هذه الفكرة Debugger

فرحت كثيراً لما ثبّت Xdebug في جهازي وعملت !!! ولكني فوجئت أن صيغة الخطأ الصادر من بيئة PHP جاء ملوناً وبعض المعلومات الآخرى فقط فقط ... واستخدام الداول الملحقة بـ Xdebug يتطلب عمل أكثر .

وهناك مشكلة : فبعض الإجراءات لا تعمل مثل :

xdebug_dump_function_trace();
xdebug_get_function_trace()

وفهمت من هذا أن Xdebug لم تثبت بشكل صحيح : ولما أشغل الـ apache يظهرلي خطأ تحذري هو:

PHP Warning: Xdebug MUST be loaded as a Zend extension in Unknown on line 0

نسخة PHP عندي هي 5.0.4

ولا أدري ما هو الناقص مع أني حملت الملف php_xdebug-2.0.0rc1-4.4.1.dll ووضعته في دليل extension

flie php.ini:
zend_extension_ts=php_xdebug-2.0.0rc1-4.4.1.dll
extension=php_xdebug.dll

أنا الآن استفدت كثيراً من الدالة debug_var لأني أضعها لإختبار وإظهار التفاصيل لأي جزء وأي متغير في البرنامج وبكل سهولة ولا تتطلب تركيب module خاص

http://localhost/mysite/index.php?debug=1

http://localhost/mysite/debug.php

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

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#8
اقتباس
وهناك مشكلة : فبعض الإجراءات لا تعمل مثل :

xdebug_dump_function_trace();
xdebug_get_function_trace()

أنت بتستخدم الأصدار 2 من Xdebug و الدوال دى مش متوفرة فيه , فى صفحة الـ functions حتلاقى كل دالة جمبها رقم الأصدارة التابعة ليه ( [1] أو [2] ) .

اقتباس
نسخة PHP عندي هي 5.0.4

ولا أدري ما هو الناقص مع أني حملت الملف php_xdebug-2.0.0rc1-4.4.1.dll ووضعته في دليل extension

flie php.ini:

zend_extension_ts=php_xdebug-2.0.0rc1-4.4.1.dll

extension=php_xdebug.dll[/code

]

الغى extension=php_xdebug.dll , انت كل الى محتاجه أول واحدة بس.

و أقرى عن xdebug أكتر حتلاقى فيها امكانيات حلوة كتير حتساعدك فى شغلك .

Web Citizen

ShrefInLife.gif

__________

General blog : Shref In Life

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…