قم بتحسين جودة التعليمات البرمجية ومنع النتائج غير المتوقعة من خلال تعلم كيفية استخدام GNU Debugger للكشف عن الأخطاء غير المرغوب فيها في التعليمات البرمجية الخاصة بك.

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

مصحح أخطاء GNU أو GDB، هو أداة تصحيح أخطاء خالدة اعتمد عليها المبرمجون لسنوات حتى الآن. إليك كيفية استخدام GDB على Linux.

إعداد نماذج البرامج

لاستكشاف ميزات GDB، ستحتاج إلى ملف قابل للتنفيذ لتجربته. للتوضيح، ستقوم بتشغيل GDB على برنامج فحص المفاتيح مرة واحدة مع توفر كود المصدر ورموز التصحيح، ومرة ​​واحدة بدون كود المصدر، وعلى برنامج بسيط متعدد الخيوط يطبع الرسائل على الشاشة، سواء كانت مكتوبة بلغة C أو مجمعة باستخدام لغة مجلس التعاون الخليجي (GNU C) مترجم).

أنت تستطيع استخدم أي مترجم C آخر ولكن تأكد من عدم تجريد الثنائي.

من المرجح أنك ستقوم بتشغيل GDB على برامجك الخاصة. لذا تأكد من تجميعها مع ضع علامة على gcc لتمكين رموز التصحيح.

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

instagram viewer
كيف يعمل تخصيص الذاكرة على لينكس لفهم البيانات الموجودة في المكدس والسجلات.

تشغيل برنامج في GDB

يمكنك تشغيل برنامج في GDB بعدة طرق. إما أن تكتب gdb ، وبمجرد تحميله، اكتب يجري. أو ابدأ gdb ثم استخدم ملف ملف قم بتحميل الملف الثنائي إلى gdb، ثم قم بتنفيذه باستخدام الأمر يجري يأمر.

إذا كان برنامجك يتطلب وسيطات سطر الأوامر ليعمل بشكل صحيح، فتأكد من إضافة الوسائط بعد اسم البرنامج. إليك بناء الجملة لتحميل البرنامج على GDB وتنفيذه باستخدام الوسائط:

gdb 
run

أو:

gdb
file
run

تحديد نقاط التوقف مع GDB

يتم تعيين نقاط التوقف في تصحيح الأخطاء يدويًا على نقاط التوقف في التعليمات البرمجية التي توقف تدفق التنفيذ عندما يصل البرنامج إلى نقطة توقف. يتيح لك تحديد نقاط التوقف التنقل خلال التعليمات البرمجية وفحص كيفية تأثير كل مرحلة من مراحل التنفيذ على البيانات والمتغيرات.

في GDB، عندما تقوم بتصحيح أخطاء برنامج باستخدام رموز التصحيح، يمكنك إما تعيين نقطة توقف حسب اسم الوظيفة أو تعيين نقطة توقف بناءً على رقم السطر. وهنا بناء الجملة:

break main
break 47

لعرض كافة نقاط التوقف في جلسة التصحيح الحالية، اكتب:

info breakpoints

لحذف نقطة توقف معينة أو نقاط توقف متعددة، اكتب:

delete 2
delete 3-5

يسمح لك GDB أيضًا بتعيين نقاط توقف مشروطة، مما يعني أن البرنامج لن يتوقف إلا إذا تم استيفاء شرط معين أثناء التنفيذ. يمكن أن يكون التغيير في قيمة استدعاء دالة متغير أو غير ناجح أو أي شيء تريده. إليك بناء الجملة لتعيين نقاط التوقف الشرطية:

break  if n == 2

إذا كنت ترغب في متابعة تنفيذ البرنامج بعد الوصول إلى نقطة توقف، فاكتب يكمل يأمر:

continue

التنقل عبر الكود

يعد التنقل خلال التعليمات البرمجية أمرًا ضروريًا لفهم كيفية تعامل البرنامج مع البيانات. من خلال التنقل بين الوظائف المختلفة في برنامجك وفحص حالة البيانات، يمكنك الحصول على فهم أفضل لكيفية تنفيذ البرنامج للمنطق الذي كتبته في التعليمات البرمجية.

كما يساعدك أيضًا على اكتشاف جذور الأعطال ودراسة سلوك البرنامج بدقة جراحية حيث يمكنك التنقل عبر كل سطر من التعليمات البرمجية كما يحلو لك. يمكنك التنقل خلال التعليمات البرمجية بثلاث طرق أساسية في GDB:

  1. خطوة: يخبر هذا الأمر GDB بالانتقال إلى السطر التالي من الملف المصدر. يتيح لك هذا بشكل أساسي اجتياز طول التعليمات البرمجية المصدر سطرًا تلو الآخر.
  2. التالي: ينفذ هذا الأمر السطر التالي من التعليمات البرمجية المصدر داخل الوظيفة الحالية ثم يتوقف. التالي يعامل الدالة كخط واحد، لذلك إذا استخدمت التالي قبل استدعاء الدالة، فسوف يعاملها كخط واحد ويتخطاها، على عكس خطوة يأمر.
  3. ينهي: ينفذ أمر النهاية جميع الأسطر المتبقية داخل الوظيفة الحالية ثم يتوقف.

فحص المتغيرات

أثناء التنقل خلال التعليمات البرمجية، قد ترغب في فحص قيمة المتغيرات لمعرفة كيف يقوم منطق البرنامج بتغييرها. إليك بناء الجملة لعرض قيمة المتغيرات في GDB:

print 

في حالة رغبتك في طباعة التغييرات في قيمة المتغير في كل مرة يتم تحديثه، يجب عليك استخدام أمر العرض. يعد هذا مفيدًا بشكل خاص عندما تريد تتبع وطباعة قيمة متغير في حلقة:

display 

تحديد نقاط المراقبة

ترتبط نقاط المراقبة ونقاط التوقف المشروطة ارتباطًا وثيقًا حيث أن كلاهما يستجيب للتغيرات في البرنامج. تُستخدم نقاط المراقبة لتتبع التغييرات في البيانات في الكود. على سبيل المثال، قد ترغب في توقف البرنامج كلما تغيرت قيمة المتغير. إليك كيفية القيام بذلك باستخدام GDB:

watch 

تصحيح الأخطاء الخاصة بمؤشر الترابط باستخدام GDB

يتيح لك GDB إجراء تصحيح الأخطاء الخاص بمؤشر الترابط عند العمل مع البرامج متعددة مؤشرات الترابط. للتوضيح، سنعمل باستخدام برنامج C بسيط يستخدم أربعة سلاسل لطباعة الرسائل مع كل سلسلة.

لعرض المواضيع التي تم إنشاؤها حاليًا في برنامجك، استخدم ملف معلومات يأمر:

info threads

للعمل مع موضوع معين، يمكنك تحديده من القائمة باستخدام رقم الفهرس الخاص به. على سبيل المثال:

thread 2

بعد تحديد الموضوع، يمكنك التنقل عبر تدفق التنفيذ الخاص به باستخدام الملف خطوة, التالي، و ينهي الأوامر كما هو موضح أعلاه.

التصحيح عن بعد مع GDB

يمكنك أيضًا تصحيح أخطاء البرامج الموجودة على نظام مختلف عن بُعد. للقيام بذلك، تحتاج إلى إعداد gdbserver على الجهاز المستهدف. يمكنك تثبيته بسهولة باستخدام مدير الحزم الافتراضي للتوزيع أو مديري الحزم الآخرين الذين قمت بتثبيتهم على النظام الخاص بك.

على سبيل المثال، لتثبيت gdbserver على الأنظمة المستندة إلى Ubuntu أو Debian، استخدم APT:

sudo apt install gdbserver

بمجرد التثبيت، انتقل إلى المجلد الثنائي وقم بتشغيل هذا الأمر لبدء تشغيل gdbserver:

gdbserver :

يجب أن يقوم gdbserver بإرجاع الإخراج الموجود والاستماع إليه على المنفذ الذي حددته. الآن على جهاز العميل، ابدأ تشغيل GDB ثم اتصل بالخادم البعيد باستخدام ملف هدف يأمر:

target remote :

كتابة البرامج النصية GDB لأتمتة التصحيح

يسمح GDB للمبرمجين بكتابة نصوص GDB التي ستنفذ أوامر GDB تلقائيًا. يساعد هذا كثيرًا عندما تحاول تصحيح نفس الجزء من التعليمات البرمجية عدة مرات. بدلاً من الاضطرار إلى تعيين نقطة التوقف، والتنقل خلال التعليمات البرمجية، وطباعة قيم متغيرة في كل مرة تقوم فيها بتحميل الملف الثنائي، يمكنك استخدام برنامج GDB النصي لأتمتة العملية بأكملها.

هنا مثال:

set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit

في البرنامج النصي أعلاه، أنت تطلب من GDB تمكين التسجيل وحفظ السجل في ملف يسمى عينة. خارج، ثم قم بتعيين نقطة توقف عند رئيسي وظيفة.

بالنسبة لنقطة التوقف رقم 1، في هذه الحالة، نقطة التوقف في الوظيفة الرئيسية، قم بتشغيل الأوامر التالية: تتبع خلفي, مطبعة, يكمل. في الأساس، سيقوم GDB أولاً بتشغيل التتبع العكسي، ثم طباعة قيمة المتغير "N"، ومواصلة التنفيذ، وأخيرًا الخروج.

لتنفيذ هذا البرنامج النصي، استخدم:

gdb -x