يستخدم GNU Debugger لتصحيح أخطاء البرنامج ، لتحليل الانهيار ، أو لمعرفة ما يفعله البرنامج في نقطة معينة. تم تطويره بواسطة GNU Project في الثمانينيات وكان أحد أكثر مصححات أخطاء سطر الأوامر استخدامًا بالإضافة إلى أنه أحد أكثر برامج GNU شيوعًا.
دعنا نكتب أولاً برنامج C صغيرًا سنقوم بتصحيحه بعد ذلك. للبدء ، قم بإنشاء ملف .c
ملف باستخدام همة
أو أي محرر من اختيارك:
اختبار فيم ج
قم بإنشاء برنامج C التالي:
#include int main () {int i = 5؛ تعويم و = 5.5 أنا = أنا + 3 ؛ f = f + 2.2 ؛ printf ("قيمة i و f هي:٪ d و٪ f \ n"، i، f)؛ العودة 0 ؛ }
صحافة هرب
للذهاب إلى وضع الأمر vim. ثم اكتب : wq
لحفظ البرنامج والخروج.
تجميع ومعرفة ما إذا كان البرنامج يعمل:
gcc test.c -o test ./test قيمة i و f هي: 8 و 7.700000
لتمكين دعم التصحيح في أحد البرامج ، نقوم بتجميعها مع -g
علم. إذا لم يتم استخدام العلم ، فلا يزال بإمكان المستخدم تصحيح أخطاء البرنامج ، وإن كان ذلك بخيارات محدودة.
gcc test.c -g -o test
لبدء التصحيح ملفنا القابل للتنفيذ اختبار
في gdb
، نحن نجري:
اختبار gdb
سيفتح ملف gdb
وحدة التحكم ، حيث يمكنك كتابة ملف gdb
أوامر. لمشاهدة قائمة بالأوامر ، استخدم ملحق مساعدة
يأمر.
مساعدة $ (gdb) قائمة فئات الأوامر: الأسماء المستعارة - نقاط توقف الأوامر الأخرى - جعل البرنامج يتوقف عند بيانات نقاط معينة - فحص ملفات البيانات - تحديد الملفات الداخلية وفحصها - أوامر الصيانة غامضة - تشغيل ميزات غامضة - تشغيل مكدس البرنامج - فحص حالة المكدس - دعم استفسارات الحالة - نقاط تتبع تسهيلات الدعم - تتبع تنفيذ البرنامج دون إيقاف البرنامج المحدد من قبل المستخدم - الأوامر المعرفة من قبل المستخدم اكتب "help" متبوعًا باسم الفئة للحصول على قائمة الأوامر في تلك الفئة. اكتب "help all" للحصول على قائمة بجميع الأوامر. اكتب "مساعدة" متبوعًا باسم الأمر للحصول على التوثيق الكامل. اكتب "apropos word" للبحث عن الأوامر المتعلقة بـ "word". ويسمح اختصار اسم الأمر إذا كان لا لبس فيه.
يمكنك بعد ذلك كتابة مساعدة class_name
لرؤية الأوامر التي تنتمي إلى تلك الفئة. للبحث عن أوامر باستخدام سلسلة فرعية ، استخدم apropos substring
.
لتعيين نقطة توقف عندما يدخل البرنامج وظيفة ، يركض:
كسر الرئيسي $ (gdb)
هنا نضع نقطة توقف عند الوظيفة الوحيدة في الكود الخاص بنا ، أي الأساسية
. استخدم الأمر يركض
لتنفيذ البرنامج حتى نقطة التوقف التالية ، أو حتى الخروج.
تشغيل $ (gdb)
لتعيين نقطة توقف في موقع معين في وظيفة ، استعمال:
استراحة * رئيسي + 4
سيؤدي هذا إلى إنشاء نقطة توقف في السطر الرابع من الوظيفة الرئيسية.
الآن، لتخطي تدفق البرنامج إلى سطر الكود التالي ، ببساطة قم بتشغيل ملف خطوة
يأمر.
$ (gdb) الخطوة 5: float f = 5.5 ؛
لعرض محتويات المتغير ، يركض عرض
.
عرض $ (gdb) i 6: i = 5
لتعديل محتويات المتغير ، التي قد تكون مطلوبة لتحليل تشغيل برنامج تحت قيم محددة لمتغير ، تشغيل تعيين متغير = التعبير
.
$ (gdb) تعيين متغير i = 10 دولارات (gdb) عرض i 7: i = 10
هنا ، يمكن أن يكون "التعبير" أي تعبير صالح (حسابي / منطقي). من أجل التبسيط ، نقوم فقط بتعيين قيمة أخرى (10) للمتغير أنا
.
لطباعة كود التجميع للبرنامج ، استخدم الأمر اسم وظيفة التفكيك
:
استخدم فقط تفكيك
لطباعة كود التجميع للبرنامج بأكمله. لاحظ السهم في سطر معين في كود التجميع. يشير إلى أن جلسة التصحيح متوقفة مؤقتًا حاليًا في موقع الذاكرة المحدد هذا (أي سطر التعليمات البرمجية هذا).
للانتقال إلى مصحح الأخطاء عند سطر معين من التعليمات البرمجية ، يركض:
(gdb) $ (gdb) jump * main + 2 استمرار عند 0x400528. نقطة التوقف 2 ، 0x000000000040052a في main () في test.c: 3 3 int main () {1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
سيؤدي هذا إلى جعل المصحح يقفز إلى موقع الذاكرة الخاص بالسطر الثاني من التعليمات البرمجية في الوظيفة الأساسية
. لاحظ أنني هنا قفزت من بداية الموقع الرئيسي إلى الموقع الثاني مباشرة. ومن ثم متغير أنا
لم يتم تعيينه مطلقًا ، مما ينتج عنه خطأ طرح مصحح الأخطاء بحيث يتعذر عليه الوصول إلى محتويات الذاكرة في عنوان المتغير أنا
.
هذه بعض الأوامر الأساسية التي يمكن أن تساعدك على البدء في تصحيح أخطاء ملف قابل للتنفيذ في Linux. نأمل أن تجد المعلومات الواردة في هذه الصفحة مفيدة.