Nalagodzhenya للحصول على مساعدة إضافية GDB. Vyvchaemo مع vykoristanny GDB الحد من عملية الطفل

G.D.B.الوصول إلى البرامج "المعقولة"، مثل أولئك الذين "يفهمون" الكود ويفكونه على التوالي، ويغيرون قيم التغييرات، ويضعون نقاط التحكم ويطرحون الأفكار... باختصار، افعل كل شيء من أجل المطور وتأكد من أن برامجك تعمل بشكل صحيح.

G.D.B.ذكريات غنية يونيكس- تقوم هذه الأنظمة أيضًا بضبط العديد من البرامج. سي من بينهم.

اتصل بنا G.D.B.أدخل الأمر في المحطة

جي دي بي

لتسجيل الدخول G.D.B.: أدخل الأمر

استقال أو ج -د

أوامر GDB الهامة الأخرى

تشغيل [وسائط سطر أوامر البرنامج] قم بتشغيل البرنامج. فاصل [رقم الصف / اسم الوظيفة] ضع نقطة فاصل للبرنامج في الصف أو الوظيفة التالية. التالي انتقل إلى الصف الهجومي دون الدخول إلى منتصف الوظيفة. خطوة انتقل إلى صف التنقل. إذا كانت هناك وظيفة في الصف، فانتقل إليها. القائمة أدخل جزءًا من رمز البرنامج (عدد الصفوف حول مكان إدخال النقطة) طباعة [تغيير] أدخل قيمة التغيير على الشاشة. info locals أدخل القيم الدقيقة لجميع التغييرات المحلية في منتصف الحلقة والوظيفة وما إلى ذلك. عرض [تغيير] أدخل قيمة التغيير على جلد الجلد. مساعدة إظهار قائمة بجميع أوامر GDB الموجودة.

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

الآن، دعنا ننتقل إلى مجلد pset2 (نعتقد أنك تتذكر بالفعل كيفية الحصول عليه) في "CS50 Virtual Laboratory" أو CS50 IDE. أدخل الأمر:

جي دي بي. / قيصر

برنامج قيصر له وظيفة واحدة، رئيسية. لنضع نقطة بداية البرنامج على الوظيفة الرئيسية:

كسر الرئيسي

لنقم بتشغيل برنامج قيصر باستخدام الوسيطة "3":

تشغيل 13

لنفترض أننا بحاجة إلى التحقق من قيم argc:

طباعة ارجك

يمكن رؤية المحور في النافذة الطرفية:

الآن نكمل البرنامج خطوة بخطوة باستخدام الأمر التالي. يمكننا أن نرى عدة مرات.

هنا المفتاح المتغير يعطي معنى. دعونا نتحقق من أهميتها في هذا الصف:

عند النقرة الأولى على التالي، يتم ضبط المفتاح القابل للتغيير على "0". لماذا غفلنا عن الرقم 3؟ على اليمين أن الفريق لم يدخل فيكونان بعد. إذا قمت بإدخال التالي عدة مرات، يطالبك البرنامج بإدخال النص.

بعد إدخال الأمر التالي مرة أخرى، سنذهب إلى منتصف الحلقة الذهنية.

التحسين الفوقي للبرامج - إزالة التعديلات من الكود. لماذا لديك، الذي عرفت كل شيء، الفرصة لتتبع معسكر المشاهير؟ ساعة من ويكوناني، هذه هي نفس عملية الإدراك نفسها (على سبيل المثال، إجراء التحولات العقلية). هنا القائد هو مساعدنا الأول. بالطبع، لدى لغة C الكثير من الإمكانيات لتشغيل البرامج دون أي متاعب: بدءًا من printf(3) البسيط وحتى أنظمة التسجيل الخاصة عبر شبكة سجل النظام. في المجمع، لا تزال هذه الأساليب راكدة، وإلا فقد تحتاج إلى توخي الحذر بشأن السجلات ومقالب ذاكرة الوصول العشوائي (RAM) وغيرها من الخطابات، والتي يسهل تطويرها في محرر تفاعلي. بالمناسبة، إذا كنت تكتب بلغة التجميع، فمن غير المرجح أن تتمكن من العمل بدون محرر.

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

دعونا نجعل الأمر بسيطا. لنأخذ برنامج Hello World ونقوم بتجميعه بالمعلومات الضرورية باستخدام مفتاح التحويل البرمجي -g:

$ دول مجلس التعاون الخليجي -g hello.s -o hello $

إطلاق جي دي بي:

$ gdb ./hello GNU gdb 6.4.90-debian حقوق الطبع والنشر (C) 2006 لمؤسسة البرمجيات الحرة، Inc. GDB هو برنامج مجاني مرخص بموجب رخصة GNU العامة، وأنت تنوي تغييره و/أو توزيع نسخ منه على أشخاص آخرين. اكتب "إظهار النسخ" لمعرفة الشروط. هذا ليس ضمانًا لـ GDB على الإطلاق. اكتب "إظهار الضمان" للحصول على التفاصيل. تم تكوين GDB هذا كـ "i486-linux-gnu"...باستخدام مكتبة libthread_db المضيفة "/lib/tls/libthread_db.so.1". (جي دي بي)

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

(gdb) b نقطة التوقف الرئيسية 1 عند 0x8048324: ملف hello.s، السطر 17. (gdb)

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

(gdb) r بدء البرنامج: /tmp/hello Breakpoint 1, main () at hello.s:17 17 movl $4, %eax /* ضع رقم النظام write = 4 اللغة الحالية: auto; أسم حاليا (gdb)

يقوم GDB بتنزيل البرنامج والتحقق من الأوامر. حدد أمر البرنامج الذي سيتم إضافته إلى الخطوة التالية، والوظائف التي سيتم إضافتها إلى الملف، ورقم الصف. بالنسبة إلى الويكي سطرًا تلو الآخر، يمكننا استخدام أمرين: step (يُختصر بـ s) والتالي (يُختصر بـ n). ينهي أمر الخطوة البرنامج عن طريق الدخول إلى قسم البرنامج الفرعي. يقوم الأمر التالي بتنفيذ تعليمات الروتين الفرعي للخيط، قطعة قطعة.

(gdb) n 20 movl $1, %ebx /* المعلمة الأولى - لتسجيل %ebx */ (gdb)

الآن تمت كتابة التعليمات الخاصة بالصف 17، ونحن نفهم أن سجل %eax يحتوي على الرقم 4. لعرض الفيروسات المختلفة على الشاشة، استخدم أمر الطباعة (المختصر p ). عند استبدال أوامر المجمع، لدى GDB علامة $replace % في إدخال السجل. دعونا نرى ما هو موجود في سجل %eax:

(gdb) ف $eax $1 = 4 (gdb)

العمل 4! يقوم GDB بترقيم جميع مخرجات التعبير. الآن لدينا الفيروس الأول (1 دولار)، وهو أقدم من 4. الآن حتى هذا الفيروس يمكنك التقدم بطلب للحصول عليه. يمكنك أيضًا إجراء حسابات بسيطة:

(gdb) ص $1 $2 = 4 (gdb) ص $1 + 10 $3 = 14 (gdb) ص 0x10 + 0x1f $4 = 47 (gdb)

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

(gdb) يبدأ سطر المعلومات السطر 20 من "hello.s" عند العنوان 0x8048329 وينتهي عند 0x804832e . (جي دي بي)

يعرض أمر القائمة (المختصر l) رمز الإخراج الخاص ببرنامجك على الشاشة. كيف يمكن تمرير الحجج:

  • رقم الصف- رقم صف ملف التدفق؛
  • الملف:row_number- رقم الصف للملف المحدد؛
  • وظائفهم- لديهم وظائف دون أي غموض.
  • الملف: function_name- لديك وظائف للملف المحدد؛
  • *عناوين- العناوين الموجودة في الذاكرة متبوعة بالتعليمات اللازمة.

إذا قمت بتمرير وسيطة واحدة، فسينتج أمر القائمة 10 صفوف من كود الإخراج في نفس المكان. من خلال تمرير وسيطتين، يمكنك تحديد الصف في البداية والصف في نهاية القائمة.

(gdb) l main 12 خلف حدود هذا الملف */ 13 .type main, @function /* main - function (وليس بيانات) */ 14 15 16 main: 17 movl $4, %eax /* ضع رقم الملف استدعاء النظام 18 كتابة = 4 في التسجيل %eax */ 19 20 movl $1, %ebx /* ضع المعلمة الأولى في السجل 21 %ebx; رقم واصف الملف 22 stdout = 1 */ (gdb) l *$eip 0x8048329 موجود في hello.s:20. 15 16 رئيسي: 17 movl $4, %eax /* ضع رقم استدعاء النظام 18 write = 4 في السجل %eax */ 19 20 movl $1, %ebx /* ضع المعلمة الأولى في السجل 21 %ebx; رقم واصف الملف 22 stdout = 1 */ 23 movl $hello_str, %ecx /* ضع معلمة أخرى في السجل 24 %ecx; مؤشر لكل صف */ (gdb) l 20, 25 20 movl $1, %ebx /* ضع المعلمة الأولى في السجل 21 %ebx; رقم واصف الملف 22 stdout = 1 */ 23 movl $hello_str, %ecx /* ضع معلمة أخرى في السجل 24 %ecx; مؤشر لكل صف */25 (gdb)

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

(gdb) n 23 movl $hello_str, %ecx /* ضع معلمة أخرى في السجل %ecx (gdb) n 26 movl $hello_str_length, %edx /* ضع المعلمة الثالثة في السجل %edx (gdb)

هذا ليس صحيحا، لقد تعبت من الضغط على ن؟ إذا قمت ببساطة بالضغط على Enter، فسيقوم GDB بتكرار الأمر المتبقي:

(gdb) 29 int $0x80 /* wiklikati pererivannya 0x80 */ (gdb) مرحبًا بالعالم! 31 movl $1, %eax /* خروج رقم ويكي النظام = 1 */ (gdb)

أمر مفيد آخر، حول نبلاء ياكو فارتو - سجلات المعلومات. بالطبع، يمكن اختصار її إلى i r . يمكنك تمرير معلمة إليها - قائمة السجلات التي تحتاج إلى تكوين. على سبيل المثال، إذا تم إنشاء تسجيل الدخول في الوضع المحمي، فمن غير المرجح أن نفوت قيم سجلات المقطع.

(gdb) معلومات السجلات eax 0xe 14 ecx 0x804955c 134518108 edx 0xe 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xb0 1208566592 eip 0x804833a 0x80 4833 أ الأعلام 0x246 [PF ZF IF] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb) سجلات المعلومات 0xe 14 ecx 0x804955c 134518108 edx 0x ه 14 إبكس 0x1 1 إسب 0xbfabb55c 0xbfabb55c إب 0xbfabb5a8 0xbfabb5a8 إيسي 0x0 0 إيدي 0xb7f6bcc0 -1208566592 إيب 0x804833a 0x804 أعلام 0x246 [PF ZF IF] (gdb)

لذا، بالإضافة إلى السجلات، لدينا أيضًا

اليوم سوف تكسب كروك آخر من اليمين
أنظمة Vivchennya Linux. سأخبرك عن الأساسيات
تولى عملك مع gdb. بعد إتقانها، يمكنك فهم كيفية عمل أي برنامج وكتابة مآثرك الخاصة.

ربما تكونون قد سمعتم جميعًا عن خطاب مثل عامل الإصلاح، gdb – وهو نفس عامل الإصلاح. GDB-جنو
مصحح الأخطاء. هذا مشابه لـ SoftICE لنظام التشغيل Windows (لأولئك الذين لا يعرفون، فهو الأكثر شهرة، وفي رأيي، أصبح الأكثر فائدة)، فقط تحت
أنظمة لينكس. على اليمين، لا يوجد الكثير من المستندات التي توضح عمل هذا الخطاب وقد أتقنته بنفسي. أوتجي،
سوف يصف المستند أوامر gdb الأساسية. سيتم عرض كل شيء في المثال. وكعقب، قررت أن تأخذ البرنامج نعم. بالنسبة لأولئك الذين لا يعرفون، يقوم هذا البرنامج ببساطة بطباعة الرمز "y" حتى لا نهاية له، لذلك قررت أن أتعلم كيفية طباعة ليس هذا الرمز، ولكن الصف "XAKEP"، والذي سيكون أكثر متعة.

حسنًا ، الآن كل شيء على ما يرام. يبدأ المحرر نفسه على النحو التالي:

إذا كان بإمكانك إدخال معلمات مختلفة، فسيكون لدينا طريقة لمتابعة البرنامج:

# gdb /usr/bin/yes

يمكنك عرض الملفات الأساسية، والتي تحتاج إلى إدخال ما يلي:

# gdb /usr/bin/yes الأساسية

قد تحتاج أيضًا إلى أمر للنظر في السجلات بدلاً من ذلك:

(gdb) سجلات المعلومات

أو نحو ذلك (نسخة قصيرة)

الآن دعونا نلقي نظرة على كيفية قفز الروبيتي بشكل زائد. يسرع
- نقاط الارتباك ونقاط الاكتظاظ ونقاط الحراسة. وبشكل أكثر تحديدًا، أود التركيز على نقاط التعلم. يمكن تثبيته على:

(gdb) وظيفة الاستراحة - Zupinity قبل الدخول إلى الوظيفة
(gdb) فاصل *العنوان - أرسل قبل اتباع التعليمات الموجودة على العنوان.

بعد التثبيت، يمكنك إلقاء نظرة على جميع النقاط التي تستخدم الأمر:

(gdb) فاصل المعلومات

ومن ثم يمكنك حذف هذه النقاط:

(gdb) نقطة توقف واضحة - de Break هو اسم نقطة التوقف
(على سبيل المثال، الوظيفة أو العنوان)

ميزة أخرى مهمة هي القدرة على عرض قيم مختلفة تلقائيًا عند انتهاء البرامج. ما هو الغرض من أمر العرض:

(gdb) قيمة العرض/التنسيق، حيث التنسيق هو تنسيق العرض، والقيمة هي التنسيق الذي يجب عرضه.

يتم توفير الأوامر التالية للعمل مع الصور:

(gdb) عرض المعلومات - يعرض معلومات حول العرض
(gdb) حذف num - de num - حذف العناصر ذات الفهرس
رقم

سيكون هذا بمثابة دليل صغير من الفرق لفهم الفكرة الرئيسية.
علاوة على ذلك، أود أن أوضح المزيد. وتذكر - لقد قدمت هنا جزءًا صغيرًا فقط من جميع إمكانيات gdb، في الواقع يوجد بها مائة مرة أكثر، لذا اقرأ وابدأ.
كما قلت obītsya، فإننا لن نحتاج إلى بروغ نعم. قد لا يتم تجنب الطريق على سيارتك مع سيارتي، كل شيء سيكون في نظام التشغيل الذي تستخدمه، إذا قمت بالتسريع من خلال البحث (الأمر
يجد).

# gdb /usr/bin/yes

بعد الإطلاق، سوف تتلقى معلومات مفصلة.

جنو جي دي بي 19991004




هذا ليس ضمانًا لـ GDB على الإطلاق. اكتب "إظهار الضمان" للحصول على التفاصيل.
تم تعديل Tsei GDB buv مثل "i386-redhat-linux"...
(لم يتم العثور على رموز التصحيح)...

بما أنه نعم، يمكننا عرض عدد لا نهائي من الرموز، سيكون من الأفضل عدم تنزيلها من المحرر، ولكن مرة أخرى
يمكن توجيه البرامج إلى وحدة تحكم أخرى. افتح محطة جديدة، واكتب who is i وافتح اسم وحدة التحكم. إنه خطأك أن تخرج
دعونا ننظر إلى الصورة:

المحور الآن مرتبط به ببساطة.

(gdb) tty /dev/pts/1

والآن دعونا نضع نقطة على الدالة puts()، ولنسهل عليك فهم معلومات الرجل حول الدالة (الأمر man
يضع)

#يشمل
int يضع (const char * s)؛
يضع() يكتب السلسلة والسطر الجديد الزائد إلى std
خارج.

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

(gdb) يضع كسر
نقطة التوقف 1 عند 0x8048698

І قم بتشغيل البرنامج نفسه، بحيث تتحقق من قواعد gdb ولا تنس النقر على الوظائف.

(جي دي بي) ص
برنامج البدء: /usr/bin/yes
نقطة التوقف 1 عند 0x4006d585: الملف ioputs.c، السطر 32.

نقطة التوقف 1، 0x4006d585 في _IO_puts (str=0x8048e59 "y") على ioputs.c:32
32 ioputs.c: لا يوجد مثل هذا الملف أو الدليل.
1: x/i $eip 0x4006d585<_IO_puts+21>: mov 0x8(%ebp),%esi

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

(gdb) مجموعة (شار)0x8048e59="X"
(gdb) مجموعة (شار)0x8048e5a = "أ"
(gdb) مجموعة (شار)0x8048e5b = "K"
(gdb) مجموعة (شار)0x8048e5c = "E"
(gdb) مجموعة (شار)0x8048e5d = "P"

حسنًا، الآن دعونا نتعجب من vitvir الخاص بنا. ما يكمن هناك في الذاكرة:

(جي دي بي) س/3سو 0x8048e59
0x8048e59<_IO_stdin_used+437>: "XAKEP\004\b"
0x8048e61<_IO_stdin_used+445>: ""
0x8048e62<_IO_stdin_used+446>: ""

الآن يمكننا أن نرى نقطة التوقف لدينا:

(gdb) فاصل المعلومات
رقم نوع Disp Enb عنوان ماذا
نقطة توقف واحدة احتفظ بـ y 0x4006d585 في _IO_puts على ioputs.c:32
وصلت نقطة التوقف بالفعل مرة واحدة
(gdb) يضع واضحة
نقطة التوقف المحذوفة 1

І استمر فيكوني حتى تتمكن من الاستمتاع بالنتيجة:

هذا كل شئ. فيما يبدو.

(جي دي بي) س
البرنامج قيد التشغيل. الخروج على أي حال؟ (ص أو ن)ص

عندما تنتهي الممارسة، قرر بنفسك وتذكر أن المشكلة في حياتك هي كل شيء.
محاور الروبوتات هي:

الإقرار قبل هذه العملية:

// إطلاق gdb
hack@exploit:~ > gdb
جنو جي دي بي 4.18
حقوق النشر محفوظة لعام 1998 لمؤسسة البرمجيات الحرة.
GDB هو برنامج مجاني يخضع لترخيص GNU العام، و
نرحب بتغييره و/أو توزيع نسخ منه في ظل ظروف معينة.
اكتب "إظهار النسخ" لمعرفة الشروط.
هذا ليس ضمانًا لـ GDB على الإطلاق. اكتب "إظهار الضمان" ل
تفاصيل.
تم تكوين Qia GDB كـ "i386-suse-linux".
(gdb) إرفاق "معرف الهوية"
(gdb) 1127 // إرفاق المثال

البحث عن الذاكرة:

(gdb) x/d أو x "العنوان" يُظهر العلامة العشرية
(gdb) x/100s "عنوان" يُظهر الـ 100 علامة العشرية التالية
(gdb) x 0x0804846c إظهار العلامة العشرية عند 0x0804846c
(gdb) x/s "address" يُظهر السلاسل في العنوان
(gdb) x/105 0x0804846c عرض 105 سلسلة عند 0x0804846c
(gdb) x/x "address" يُظهر العنوان السداسي العشري
(gdb) x/10x 0x0804846c إظهار 10 عناوين عند 0x0804846c
(جي دي بي) س/ب 0x0804846c
(gdb) x/10b 0x0804846c-10 إظهار البايت عند 0x0804846c-10
(gdb) x/10b 0x0804846c+20 إظهار البايت عند 0x0804846c+20
(gdb) x/20i 0x0804846c عرض 20 تعليمات للمجمع على العنوان

قائمة بجميع الأقسام في الملف المترجم:

(gdb) أقسام معلومات الصيانة // أو
(gdb) ماي ط ق

ملف تنفيذي:
`/home/hack/homepage/challenge/buf/basic"، نوع الملف
elf32-i386.
0x080480f4->0x08048107 في 0x000000f4: .interp ALLOC

0x08048108->0x08048128 في 0x00000108: علامة .note.ABI
تخصيص تحميل البيانات للقراءة فقط HAS_CONTENTS
0x08048128->0x08048158 في 0x00000128: .hash ALLOC
قم بتحميل البيانات التي تحتوي على محتويات للقراءة فقط
0x08048158->0x080481c8 في 0x00000158: تخصيص .dynsym
قم بتحميل البيانات التي تحتوي على محتويات للقراءة فقط
0x080481c8->0x08048242 في 0x000001c8: تخصيص .dynstr
قم بتحميل البيانات التي تحتوي على محتويات للقراءة فقط
0x08048242->0x08048250 في 0x00000242: .gnu.version
تخصيص تحميل البيانات للقراءة فقط
HAS_CONTENTS

شليوب على العنوان:

(gdb) تفكيك الرئيسي
تفريغ رمز المجمع للوظيفة الرئيسية:
0x8048400

: دفع %ebp
0x8048401 : الحركة %esp،%ebp
0x8048403 : فرعي $0x408,%esp
0x8048409 : أضف $0xfffffff8,%esp
0x804840ج : mov 0xc(%ebp),%eax
0x804840f : أضف $0x4,%eax
0x8048412 : موف (%eax)،٪edx
0x8048414 : ادفع %edx
0x8048415 : lea 0xfffffc00(%ebp),%eax
...

(gdb) فاصل *0x8048414 // مثال
نقطة التوقف 1 عند 0x8048414
(gdb) كسر رئيسي // مثال
نقطة التوقف 2 عند 0x8048409
(جي دي بي)

GNU Debugger هي أداة محمولة لمشروع GNU تعمل على العديد من الأنظمة المشابهة لـ UNIX وتدير مجموعة واسعة من البرامج، بما في ذلك C وC++ وAda وFortran. GNU Debugger هو برنامج مرخص بموجب رخصة GNU العامة.

استنادًا إلى GNU Debugger الذي كتبه ريتشارد ستالمان في عام 1988. كان يعتمد على محرر DBX الذي جاء مع توزيع BSD. من 1990 إلى 1993 روك. قاد المشروع جون جيلمور خلال بداية حياته المهنية في Cygnus Solutions. يتم حاليًا تنسيق التطوير من قبل اللجنة التوجيهية لـ GDB، وهي إحدى الشركات التابعة لمؤسسة البرمجيات الحرة.

التفاصيل الفنية لمصحح أخطاء جنو

  • سمات

يوفر GNU Debugger ميزات رائعة للتحكم في البرامج في أجهزة الكمبيوتر. يمكن للمستخدمين تغيير البرامج الداخلية واستدعاء الوظائف بشكل مستقل عن سلوك البرنامج الأصلي. يستطيع GNU Debugger تحليل الملفات المضغوطة بتنسيق a.out، وCOFF (بما في ذلك الملفات بتنسيق Windows)، وECOFF، وXCOFF، وELF، وSOM، واستخراج المعلومات المفيدة من تنسيقات الطعنات، وCOFF، وECOFF، وDWARF، وDWARF2. يوفر تنسيق DWARF2 أكبر إمكانية للتحسين.

تم تطوير مصحح أخطاء جنو بشكل نشط. على سبيل المثال، أضاف الإصدار 7.0 ميزة “الرصيد المتجدد”، والتي تتيح لك مشاهدة عملية التفكيك لمعرفة ما حدث. أيضًا في الإصدار 7.0 تمت إضافة دعم للبرمجة النصية على .

للعمل مع GNU Debugger، تم إنشاء أدوات تطوير أخرى، على سبيل المثال، أجهزة استشعار الذاكرة.

  • منصات متعددة ودعم الأنظمة الجديدة

يمكن تجميع GNU Debugger لدعم البرامج لمنصات متعددة والتنقل بينها أثناء الجلسة الجارية. المعالجات التي يدعمها GNU Debugger (2003): Alpha وARM وH8/300 وSystem/370 وSystem/390 وx86 وx86-64 وIA-64 (Itanium) وMotorola 68000 وMIPS وPA-RISC وPowerPC وSuperH ، SPARC، VAX، A29K، ARC، AVR، CRIS، D10V، D30V، FR-30، FR-V، Intel i960، M32R، 68HC11، Motorola 88000، MCORE، MN10200، MN10300، NS32K، NS32K. (لن تكون هناك أي إصدارات جديدة تدعم أيًا منها.) يمكن لجميع الأنظمة الأساسية التي لا يمكن تشغيل GNU Debugger عليها، طالما تم تثبيت النظام، استخدام جهاز محاكاة مدمج (معالجات ARM، AVR)، أو يمكن تجميع إضافة ki لهم باستخدام برامج فرعية خاصة لضمان الأداء الممتاز ضمن برنامج GNU Debugger الذي يعمل على كمبيوتر بائع التجزئة. ملف الإدخال للتحسين، كقاعدة عامة، ليس الملف المزدوج الذي يتم وميضه، ولكنه ملف بأحد التنسيقات التي تدعم المعلومات المفيدة، وخاصة ELF، والتي يتم دمج اثنين منها بمساعدة رمز أدوات مساعدة خاصة للبرامج الثابتة.

  • مجاور

عند تكوينه عن بعد، يعمل GNU Debugger على جهاز واحد، ويعمل البرنامج الذي يتم تعديله على جهاز آخر. تتم الاتصالات باستخدام بروتوكول خاص عبر المنفذ التسلسلي أو TCP/IP. بروتوكول التفاعل مع مصحح الأخطاء خاص بـ GNU Debugger، ويتم تضمين رموز الإخراج الخاصة بالبرامج الفرعية الضرورية في أرشيفات مصحح الأخطاء. وكبديل، يمكن للنظام الأساسي المستهدف تشغيل برنامج gdbserver، الذي يستخدم نفس البروتوكول مثل حزمة GNU Debugger، والتي توفر وظائف منخفضة المستوى لنقطة التثبيت والوصول إلى السجلات والذكريات.

تم تصميم هذا الوضع للتفاعل مع ميزات Linux KGDB kernel المضمنة. بهذه المساعدة، يمكن للمطور تخصيص النواة كبرنامج أساسي: تثبيت نقاط الذاكرة، والعمل من خلال كود wiki، ومراجعة التغييرات. يتكون مدير التطبيقات من جهازين متصلين عبر Ethernet أو كبل تسلسلي، أحدهما يشغل GNU Debugger والآخر يشغل النواة التي يتم تطويرها.

  • واجهة كوريستوفالنيتسكي

تماشيًا مع أيديولوجية مؤسسة البرمجيات الحرة، يوفر GNU Debugger بدلاً من الواجهة الرسومية القدرة على الاتصال بـ IDEs الحديثة، أو الأصداف الرسومية الأخرى، أو استخدام الواجهة النصية القياسية لوحدة التحكم. للحصول عليه من برامج خارجية، يمكنك استخدام لغة صف النص (كما تم تقسيمها في الإصدارات الأولى من DDD Shell)، أو لغة النص gdb/mi، أو واجهة اللغة.

تم إنشاء واجهات مثل DDD وcgdb وGDBtk/Insight ووضع GUD في . يمكن أن تتفاعل IDEs التالية مع GNU Debugger:

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

لطلب إنشاء معلومات مفيدة، أدخل رمز التبديل "-g" عند بدء تشغيل المترجم.

لا يمكن لمعظم مترجمي لغة C معالجة المحولات `-g' و'-O' في نفس الوقت. باستخدام هؤلاء المترجمين، لا يمكنك إنشاء ملفات محسنة تحتوي على معلومات قيمة.

دول مجلس التعاون الخليجي، مترجم GNU C، يشجع `-g" مع أو بدون `-O" لتحسين التعليمات البرمجية المحسنة. نحن ننصحك بذلك أولاًلقد استخدمت "-g" عند تجميع البرامج. قد تعتقد أن برنامجك صحيح، ولكن ليس هناك شعور بالنجاح.

إذا قمت بتشغيل برنامجك في منتصف النافذة التي تدعم العمليات، فإن التشغيل ينشئ عملية خفيفة، وهذه العملية تنهي برنامجك. (بالنسبة للأنظمة التي لا تدعم العمليات، سيتم الانتقال إلى بداية البرنامج.)

تكمن برامج Vikonanny في شكل معلومات مشتقة من العملية التي ولدتها. يوفر GDB طرقًا لتحديد المعلومات التي تحتاج إلى إنشائها قبلإطلاق البرنامج. (يمكنك تغيير هذه المعلومات بعد بدء التشغيل، وإلا فسيتم تطبيق هذه التغييرات على برنامجك فقط عند بدء التشغيل.) يمكن تقسيم هذه المعلومات إلى الفئات التالية: حدودحدد المعلمات التي يحتاج برنامجك إلى تمريرها، مثل معلمات أمر التشغيل. نظرًا لأن نظامك يحتوي على غلاف، فإنه يتم استخدامه لتمرير المعلمات، لذلك عند وصفها، يمكنك استخدام أشياء أخرى (مثل فتح القوالب أو استبدال القوالب البديلة). في أنظمة Unix، يمكنك التحكم في الصدفة التي ستحل محل برنامج SHELL الوسيط. القسم 4.3 الحجج لبرنامجك. سيريدا.تأكد من أن برنامجك يبني جوهره في GDB، أو يمكنك استخدام أوامر بيئة مجموعة GDB وأوامر البيئة غير المحددة لتغيير مقدار النواة التي تتدفق إليه. القسم 4.4 وسط العمل لبرنامجك. دليل العمليقوم برنامجك بتفريغ دليل العمل الخاص به في GDB. يمكنك إدراج دليل عمل GDB باستخدام الأمر cd. القسم 4.5 دليل العمل لبرنامجك. مقدمة وعرض قياسي.تأكد من أن برنامجك يستخدم نفس الأجهزة للإدخال والإخراج القياسي مثل GDB. يمكنك إعادة توجيه مدخلاتك إلى أمر التشغيل، أو استخدام الأمر tty لتثبيت جهاز مختلف لبرنامجك. القسم 4.6 مقدمة وإصدار البرامج. مقدماً:إذا كنت تريد أن تعمل إعادة توجيه الإدخال والإخراج، فلا يمكنك تحديد قنوات لنقل بيانات الإخراج من البرامج التي تقوم بتشغيل برامج أخرى؛ إذا حاولت ذلك، فسوف تمر عبر GDB بالكامل حتى تقوم بتثبيت البرنامج الخاطئ.

عند إصدار أمر التشغيل، يبدأ برنامجك في التعطل. شعبة. القسم 5. تطوير واستمرار البرنامج، لمناقشة كيفية تحسين البرنامج الخاص بك. بمجرد برمجة البرنامج الخاص بك، يمكنك استدعاء وظائف البرنامج باستخدام أوامر الطباعة أو الاتصال. القسم 8. متابعة البيانات.

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

4.3 الحجج لبرنامجك

أول شيء هو أن GDB يجب أن يعمل بعد الإعداد حتى يتم إنشاء العملية المحددة - وهذا خطأ. يمكنك مراقبة عملية التنفيذ وتغييرها باستخدام أوامر GDB، حسب توفرها، إذا قمت بتشغيل العمليات باستخدام run . يمكنك إدراج نقاط الربط؛ يمكنك إنهاء البرنامج واحدًا تلو الآخر ومتابعة الخروج الأصلي، ويمكنك تغيير مناطق البيانات. إذا كنت تريد متابعة عملية التحرير بعد الانضمام إلى GDB الجديد، فيمكنك استخدام أمر المتابعة. فصل بمجرد الانتهاء من إعداد عملية الاستحواذ، يمكنك استخدام أمر الفصل لتوصيله بـ GDB. وتستمر العملية بانتصاره. بعد أمر الفصل، تصبح هذه العملية وGDB مستقلين تمامًا مرة أخرى، وتكون جاهزًا للانضمام إلى عملية أخرى أو إطلاقها باستخدام run. لا يتم تكرار الفصل إذا قمت بكتابة RET مرة أخرى بعد ترك الأمر.

إذا خرجت من GDB أو استخدمت أمر التشغيل أثناء تشغيل عملية جديدة، فسوف تقوم بإنهاء العملية بأكملها. بالنسبة للترقيات، سيطلب GDB التأكيد إذا كنت تنوي إكمال أحد هذه الخطابات؛ يمكنك التحكم فيما إذا كنت بحاجة إلى تأكيد أم لا باستخدام أمر تعيين التأكيد (القسم 15.6 إشعار مسبق غير ضروري).

4.8 الحرمان من عمليات الطفل

kill ابحث عن العملية الفرعية التي تم تثبيت برنامجك فيها ضمن GDB.

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

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

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