يلعب المنقح Debugger دورا بالغ الأهمية في أي نظام لتطوير البرمجيات. حيث لا يمكن لأي شخص أن يكتب كودا خالي من العلل من المرة الأولى. فخلال عملية التطوير، تظهر العلل (bugs) وتستلزم أن تحل حتى تتحسن جودة البرنامج. وبكل تأكيد فإن نظام التطوير لا يكتمل من دون وجود منقح. وعندما نتكلم عن مجتمع مطوري البرمجيات الحرة، فإن منقح جنو GNU Debugger هو الأفضل بلا منازع، حتى أنه يستخدم لتطوير البرامج التجارية على منصات يونكس.
منقح جنو GNU Debugger ، ويعرف أيضا gdb ، يسمح لنا بأن نغوص في الكود بينما هو يعمل أو يتيح لنا معرفة ماذا كان يفعل البرنامج قبل أن ينهار. وبشكل أساسي فإن GDB يساعدنا في فعل أربعة أشياء لتمسك بالأخطاء في الشفرة المصدرية:
- تشغيل البرنامج بخيارات محددة والتي من شأنها أن تؤثر على سلوكه العام.
- توقيف البرنامج في شروط محددة.
- اختبار الانهيار أو متى توقف البرنامج.
- تغيير الشفرة و تجربة البرنامج بالشفرة المعدلة مباشرة.
يمكننا أن نستخدم gdb لتنقيح البرامج المكتوبة بلغة السي والسي بلس بلس من دون أي عناء. بينما يدعم منقح gdb بشكل جزئي لغات البرمجة D و Modula-2 و Fortran.
##البدء مع منقح جنو GDB
لاستخدام GDB يجب أن تشغله من سطر الأوامر بأمر gdb، وحالما تفعل ذلك فإن سيظهر بعض المعلومات حوله، و سيدخلك في محث gdb مثلما هو يظهر بالأسفل
##أشهر الأوامر استخداما في GDB
الجدول التالي يستعرض أشهر أوامر gdb، وهي تستخدم داخل محث gdb:
| الوصف | الأمر |
|------------------------------------------------------------------|------------|
| تشغيل البرنامج | run |
| الخروج من gdb | quit |
| اطبع التعبير حيث expr يمكن أن يكون اسم متغير | print expr |
| اذهب للسطر الثاني | next |
| اقفز إلى داخل السطر التالي | step |
| استمر من السطر الحالي إلى نهاية البرنامج أو نقطة التنقيح التالية | continue |
لاحظ الفرق بين أمر step و next. فأمر next لا يذهب لداخل الدالة إذا كان السطر التالي هو استدعاء لدالة ما، بينما أمر step يسمح بالذهاب لداخل الدالة ويعرض ما يحدث بداخلها.
##جلسة تنقيح بسيطة باستخدام GDB
لنفترض أننا كتبنا الشفرة المصدرية التالية:
int sum (int a, int b) {
int c;
c = a + b;
return c;
}
int main() {
int x, y, z;
printf("\nEnter the first number: ");
scanf("%d", &x);
printf("Enter the second number: ");
scanf("%d", &y);
z = sum (x, y);
printf("The sum is %d\n\n", z);
return 0;
}
ومن أجل أن نستطيع أن ننقح هذه الشفرة يجب أن نترجمها باستخدام خيار -g في مترجم gcc
Enter the first number: 2
Enter the second number: 3
Breakpoint 1, sum (a=2, b=3) at sum.c:5
5 c = a + b;
(gdb) p a
$1 = 2
(gdb) p b
$2 = 3
(gdb) c
Continuing.
The sum is 5
[Inferior 1 (process 3444) exited normally]
Enter the first number: 1
Enter the second number: 2
Breakpoint 1, main ( ) at sum.c:16
16 printf("The sum is %d\n\n", z);
(gdb) set z=4
(gdb) c
Continuing.
The sum is 4
##تفعيل وإلغاء نقاط التنقيح
للحصول على قائمة بنقاط التنقيح اكتب info breakpoints
##تنقيح البرامج التي تعمل بالفعل
هناك الكثير من البرامج التي تشتغل في الخلفية على نظام جنو/لينكس. لتنقيح أي عملية تشتغل في الخلفية، فنحن أولا بحاجة إلى رقم العملية، إن أمر pidof يعطيك رقم العملية pid :
هذه المقالة مترجمة من الانجليزية، المصدر هنا.