السلام عليكم ورحمة الله وبركاته في أول مقالة تقنيه في مدونتي المتواضعه ✨.
اليوم سنتحدث عن موضوع شيق في البرمجه ألا وهو كيفية عمل Debug لبرنامج لإقتناص الأخطاء المتعلقه بالذاكره (segmentation fault) بكلاً من (++C/C) عبر الإستعانه بملفات الـcore، سنشرح عنها، ماهي؟ وكيفية جعلها تتولد، هذا ماسنتعرف عليه في هذا المقال.. تابعوا معي.
ماهي ملفات الـCore؟
ملفات الـcore بكل بساطه هي ملفات يتم توليدها عندما تحدث مشكله متعلقه بالذاكره في البرنامج وتسبب توقف عمله مثل (buffer overflow, stack overflow, …) وكلها مشاكل متعلقه في الوصول غير المصرح به لمواقع في الذاكره او امتلاء قسم الذاكره المخصص بالبرنامج لأي سببٍ كان، إذن؟ ماذا يحدث ولماذا في الأصل يتم توليدها؟ سؤال جيد، مايحدث هنا خلف الكواليس هو انه عند حدوث مشكلة على سبيل المثال (استخدامك لداله ذاتيه الإستدعاء دون وضع شرط توقف base case) في هذه الحاله سيتوقف البرنامج عن العمل وستُحفظ حالة الذاكره عند لحظة توقف البرنامج عن العمل.
كيف نقوم بتوليدها؟
بداخل ملف الـcore. ولتوليدها على نظام لينكس نكتب الأمر التالي :
ulimit -c unlimited
الـflag -c يرمز إلى core وهنا نخبر النواه اننا نرغب بأن تقوم بتوليد عدد لامحدود من ملفات الـcore، والآن ماذا بعد؟ الآن نقوم بكتابة الأمر التالي والذي نكتب به اسم ملف الـcore الي سيتم توليده إلى ملف core_pattern : وجبالتنويه ان الأمر ينفذ بصفتك root user
echo "./core" > /proc/sys/kernal/core_pattern
يمكنك وضع اي اسم تريده ولكن لتحقيق الوضوح قم بتسميته core او mem_junk
أهم خطوه يجب القيام بها قبل عمل Compile
حتى تعمل معك الطريقه ويستطيع الـGNU Debugger (gdb) ان يعطيك معلومات عن الخطأ يجب عند وقت الكومبايل تمرير الflag -g :
g++ main.cpp -g -o main
وهذا الـflag يخبر الكومبايلر بدمج معلومات عن البرنامج و(Debugging flags) مع الملف التنفيذي.
الخطوه الأخيره
الآن انتهينا من اهم الخطوات لجعل النظام يقوم بتوليد هذه الملفات لنا في كل مره يتوقف فيها البرنامج، كل ماتبقى الآن هو قراءتها وتحليل المشكله لمعرفة السبب وكيفية حله.. بكل بساطه سنستخدم gdb كما يلي :
gdb ./main ./core
لاحظ اننا نمرر له الملف التنفيذي للبرنامج وملف الـcore الذي تولد عند توقف البرنامج، والـdebugger سيقوم بتحليل الملف وتوليد بشكل مبسط سبب التوقف على الشاشه.
الخاتمه
هذا كل ماكان لدي لهذا اليوم، اتمنى ان تكون المقاله قد نالت على إعجابكم وإستحسانكم واستخلصتم منها الفائده. وحتى لقائنا الاَخر دمتم سالمين ✨🖤!.