الدرس 25: gdb — تنقيح شيفرة native و core dumps
برنامج C++ الخاص بك ينهار بـ segfault — null pointer dereference، أو stack overflow، أو buffer overflow. كيف تجد السطر الذي تسبب في ذلك؟ إن gdb (GNU Debugger) هو الأداة القياسية لتنقيح شيفرة native على Linux. فهو يتيح لك التوقف عند breakpoints، والتقدم سطراً بسطر، وفحص قيم المتغيرات، وتحليل core dum
gdb يشبه محققاً يستطيع تجميد الزمن. عندما ينهار برنامج فإنه يسأل: 'ما كانت قيمة هذا المتغير لحظة الانهيار؟ من الذي استدعى هذه الدالة؟ أين كنا بالضبط؟' إن core dump هو لقطة من الذاكرة تُحفظ لحظة الانهيار — مثل صورة لمسرح جريمة يمكنك فحصها بعد ساعات من وقوع الحادثة.
- gdb
- أداة التنقيح (debugger) القياسية للغة C/C++ على Linux. تتيح التنفيذ خطوة بخطوة، وbreakpoints، وفحص المتغيرات، وتحليل core dump.
- نقطة توقف (breakpoint)
- تعليمة إلى gdb لإيقاف التنفيذ عند الوصول إلى سطر محدد من الشيفرة. تتيح لك فحص حالة البرنامج عند نقطة دقيقة.
- backtrace (bt)
- أمر في gdb يعرض مكدس الاستدعاءات (call stack) الحالي: قائمة بكل الدوال التي استُدعيت ولم تعُد بعد، من الأحدث إلى الأقدم.
- core dump
- ملف يُنشأ عندما ينهار برنامج، يحتوي على لقطة من ذاكرة البرنامج وسجلاته (registers) ومكدس الاستدعاءات (call stack) لحظة الانهيار. يستطيع gdb تحليله post-mortem.
- watchpoint
- مثل breakpoint لكن على متغير: يتوقف gdb في كل مرة تتغير فيها قيمة المتغير. مفيد لإيجاد المكان في الشيفرة الذي تتغير فيه قيمة لا ينبغي أن تتغير.