مصحح أخطاء جنو

مصحح أخطاء جنو
المطور(ون)مشروع جنو
الإصدار الأولي1986 ؛ منذ 38 سنة ( 1986 )
إصدار مستقر
15.1 [1]  / 7 يوليو 2024
مستودع
  • sourceware.org/git/binutils-gdb.git
مكتوب فيسي ، سي++ ، بايثون
نظام التشغيلشبيه يونكس ، ويندوز
يكتبمصحح الأخطاء
رخصةرخصة جنو العمومية الإصدار 3
موقع إلكترونيwww.gnu.org/software/gdb

GNU Debugger ( GDB ) هو مصحح محمول يعمل على العديد من أنظمة يونكس ويعمل مع العديد من لغات البرمجة ، بما في ذلك Ada و Assembly و C و C++ و D و Fortran و Haskell و Go و Objective-C و OpenCL C و Modula-2 و Pascal و Rust ، [2] وجزئيًا مع لغات أخرى. [3]

تاريخ

تم كتابة GDB لأول مرة بواسطة ريتشارد ستالمان في عام 1986 كجزء من نظام GNU الخاص به، بعد أن أصبح GNU Emacs الخاص به "مستقرًا بشكل معقول". [4] GDB هو برنامج مجاني تم إصداره بموجب رخصة جنو العمومية (GPL). تم تصميمه على غرار مصحح أخطاء DBX ، الذي جاء مع توزيعات Berkeley Unix . [4]

من عام 1990 إلى عام 1993 كان جون جيلمور هو الذي يتولى صيانته . [5] والآن يتم صيانته بواسطة لجنة توجيه GDB التي يتم تعيينها من قبل مؤسسة البرمجيات الحرة . [6]

التفاصيل الفنية

سمات

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

تتضمن معالجات هدف GDB (اعتبارًا من عام 2003): Alpha و ARM و AVR و H8/300 وAltera Nios / Nios II و System/370 و System 390 و X86 وامتداده 64 بت X86-64 و IA-64 "Itanium" و Motorola 68000 و MIPS و PA-RISC و PowerPC و SuperH و SPARC و VAX . تتضمن معالجات الهدف الأقل شهرة المدعومة في الإصدار القياسي A29K و ARC و ETRAX CRIS وD10V وD30V وFR-30 و FR-V و Intel i960 و 68HC11 و Motorola 88000 و MCORE وMN10200 و MN10300 و NS32K وStormy16 و Z8000 . (من المحتمل ألا تدعم الإصدارات الأحدث بعضًا من هذه المعالجات). يحتوي GDB على محاكيات مجمعة لمعالجات هدف أقل شهرة مثل M32R أو V850 . [7]

لا يزال GDB قيد التطوير بشكل نشط. اعتبارًا من الإصدار 7.0، تتضمن الميزات الجديدة دعمًا لنصوص Python [8] واعتبارًا من الإصدار 7.8، تتضمن أيضًا نصوص GNU Guile . [9] منذ الإصدار 7.0، أصبح دعم "التصحيح العكسي" - مما يسمح لجلسة التصحيح بالتراجع إلى الوراء، تمامًا مثل إعادة تشغيل برنامج معطل لمعرفة ما حدث - متاحًا. [10]

تصحيح الأخطاء عن بعد

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

يستخدم KGDB نفس الوضع أيضًا لتصحيح أخطاء نواة Linux قيد التشغيل على مستوى المصدر باستخدام gdb. باستخدام KGDB، يمكن لمطوري النواة تصحيح أخطاء النواة بنفس الطريقة التي يصححون بها أخطاء برامج التطبيق. يجعل من الممكن وضع نقاط توقف في كود النواة، والتنقل عبر الكود، ومراقبة المتغيرات. في البنيات التي تتوفر فيها سجلات تصحيح أخطاء الأجهزة، يمكن تعيين نقاط مراقبة تعمل على تشغيل نقاط توقف عند تنفيذ عناوين ذاكرة محددة أو الوصول إليها. يتطلب KGDB جهازًا إضافيًا متصلًا بالجهاز لتصحيح أخطائه باستخدام كبل تسلسلي أو إيثرنت . في FreeBSD ، من الممكن أيضًا تصحيح الأخطاء باستخدام الوصول المباشر إلى الذاكرة (DMA) عبر FireWire . [13]

واجهة المستخدم الرسومية

لا يحتوي المصحح على واجهة مستخدم رسومية خاصة به ، ويستخدم افتراضيًا واجهة سطر أوامر ، على الرغم من أنه يحتوي على واجهة مستخدم نصية . تم بناء العديد من الواجهات الأمامية له، مثل UltraGDB وXxgdb و Data Display Debugger (DDD) و Nemiver وKDbg ومصحح Xcode وGDBtk/Insight وGede [1] وSeer [2] وHP Wildebeest Debugger GUI (WDB GUI). يمكن لبيئات التطوير المتكاملة مثل Codelite و Code::Blocks و Dev-C++ و Geany وGNAT Programming Studio (GPS) و KDevelop و Qt Creator و Lazarus و MonoDevelop و Eclipse و NetBeans و Visual Studio التفاعل مع GDB. يحتوي GNU Emacs على "وضع GUD" وتوجد أدوات لـ Vim (مثل clewn). توفر هذه المرافق مرافق مماثلة لبرامج التصحيح الموجودة في بيئات التطوير المتكاملة.

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

الداخلية

يستخدم GDB نداء نظام يسمى ptrace (الاسم هو اختصار لـ "process trace") لمراقبة والتحكم في تنفيذ عملية أخرى، وفحص ذاكرة العملية وسجلاتها وتغييرها.

أوامر gdb الشائعةمكالمات ptrace المقابلة
(gdb) start PTRACE_TRACEME – يجعل الوالد متتبعًا (يتم استدعاؤه بواسطة المتتبع)
(gdb) attach PID PTRACE_ATTACH – إرفاق عملية قيد التشغيل
(gdb) stop kill(child_pid, SIGSTOP)(أو PTRACE_INTERRUPT )
(gdb) continue تتبع_المسار
(gdb) info registers PTRACE_GET(FP)REGS(ET) و PTRACE_SET(FP)REGS(ET)
(gdb) x PTRACE_PEEKTEXT و PTRACE_POKETEXT

يتم تنفيذ نقطة التوقف عن طريق استبدال تعليمة في عنوان ذاكرة معين بتعليمات خاصة أخرى. يؤدي تنفيذ تعليمة نقطة التوقف إلى حدوث SIGTRAP.

أمثلة على الأوامر

$ gdb program تصحيح أخطاء "البرنامج" (من shell)
(gdb) run -v قم بتشغيل البرنامج المحمل بالمعلمات
(gdb) bt التتبع الخلفي (في حالة تعطل البرنامج)
(gdb) info registers تفريغ كافة السجلات
(gdb) disas $pc-32, $pc+32 تفكيك

جلسة نموذجية

خذ بعين الاعتبار الكود المصدر التالي المكتوب بلغة C :

#تضمين <stdio.h> #تضمين <stdlib.h> #تضمين <string.h> 
 
 

size_t foo_len ( const char * s ) { return strlen ( s ); }     

     


int main ( int argc ، char * argv [] ) { const char * a = NULL ؛      

      

  printf ( "حجم a = %lu \n " , foo_len ( a ) );   

  الخروج ( 0 ) ;  

باستخدام مُجمِّع GCC على Linux ، يجب تجميع الكود أعلاه باستخدام -gالعلم من أجل تضمين معلومات التصحيح المناسبة على الملف الثنائي المُولَّد، مما يجعل من الممكن فحصه باستخدام GDB. بافتراض أن الملف الذي يحتوي على الكود أعلاه يحمل اسمًا example.c، يمكن أن يكون الأمر الخاص بالتجميع :

$ gcc  example.c  -Og  -g  -o  مثال

والآن يمكن تشغيل الثنائي:

$ ./example
 خطأ التجزئة

نظرًا لأن كود المثال، عند تنفيذه، يُنشئ خطأ تجزئة ، فيمكن استخدام GDB لفحص المشكلة.

$ gdb  ./example
 GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) 
حقوق الطبع والنشر (C) 2011 Free Software Foundation, Inc. 
الترخيص GPLv3+: GNU GPL الإصدار 3 أو أحدث <https://gnu.org/licenses/gpl.html> 
هذا برنامج مجاني: أنت حر في تغييره وإعادة توزيعه. 
لا توجد ضمانات، إلى الحد الذي يسمح به القانون. اكتب "show copying" 
و"show warranty" للحصول على التفاصيل. 
تم تكوين GDB هذا على أنه "x86_64-redhat-linux-gnu". 
للحصول على تعليمات الإبلاغ عن الأخطاء، يرجى الاطلاع على: 
<https://www.gnu.org/software/gdb/bugs/>... 
قراءة الرموز من /path/example... تم. 
(gdb)  تشغيل 
بدء تشغيل البرنامج: /path/example

تلقى البرنامج إشارة SIGSEGV، خطأ التجزئة. 
0x0000000000400527 في foo_len (s=0x0) في example.c:7 
7 return strlen (s); 
(gdb)  print s 
$ 1 = 0x0
  

المشكلة موجودة في السطر 7، وتحدث عند استدعاء الدالة strlen(لأن حجتها، s، هي NULL). اعتمادًا على تنفيذ strlen ( مضمن أو غير مضمن)، يمكن أن يكون الناتج مختلفًا، على سبيل المثال:

GNU gdb (GDB) 7.3.1 
حقوق الطبع والنشر (C) 2011 Free Software Foundation, Inc. 
الترخيص GPLv3+: GNU GPL الإصدار 3 أو أحدث <https://gnu.org/licenses/gpl.html> 
هذا برنامج مجاني: يمكنك تغييره وإعادة توزيعه. 
لا توجد ضمانات، إلى الحد الذي يسمح به القانون. اكتب "show copying" 
و"show warranty" للحصول على التفاصيل. 
تم تكوين GDB هذا على أنه "i686-pc-linux-gnu". 
للحصول على تعليمات الإبلاغ عن الأخطاء، يرجى الاطلاع على: 
<https://www.gnu.org/software/gdb/bugs/>... 
قراءة الرموز من /tmp/gdb/example... تم. 
(gdb)  تشغيل 
البرنامج المبدئي: /tmp/gdb/example

استقبل البرنامج إشارة SIGSEGV، خطأ التجزئة. 
0xb7ee94f3 في strlen () من /lib/i686/cmov/libc.so.6 
(gdb)  bt 
# 0   0xb7ee94f3 في strlen () من /lib/i686/cmov/libc.so.6
 # 1 0x08048435 في foo_len ( s = 0x0 ) في example.c:7
 # 2 0x0804845a في main ( argc = <optimized out>، argv = <optimized out> ) في example.c:14
                      

لإصلاح المشكلة، يجب أن يحتوي المتغير a(في الدالة main) على سلسلة نصية صالحة. فيما يلي نسخة ثابتة من الكود:

#تضمين <stdio.h> #تضمين <stdlib.h> #تضمين <string.h> 
 
 

size_t foo_len ( const char * s ) { return strlen ( s ); }     

   


int main ( int argc , char * argv [] ) { const char * a = "هذه سلسلة اختبار" ;      

      

  printf ( "حجم a = %lu \n " , foo_len ( a ) );   

  الخروج ( 0 ) ;  

إن إعادة تجميع وتشغيل الملف القابل للتنفيذ مرة أخرى داخل GDB الآن يعطي نتيجة صحيحة:

$ gdb  ./example
 GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) 
حقوق الطبع والنشر (C) 2011 Free Software Foundation, Inc. 
الترخيص GPLv3+: GNU GPL الإصدار 3 أو أحدث <https://gnu.org/licenses/gpl.html> 
هذا برنامج مجاني: أنت حر في تغييره وإعادة توزيعه. 
لا توجد ضمانات، إلى الحد الذي يسمح به القانون. اكتب "show copying" 
و"show warranty" للحصول على التفاصيل. 
تم تكوين GDB هذا على أنه "x86_64-redhat-linux-gnu". 
للحصول على تعليمات الإبلاغ عن الأخطاء، يرجى الاطلاع على: 
<https://www.gnu.org/software/gdb/bugs/>... 
قراءة الرموز من /path/example... تم. 
(gdb)  تشغيل 
برنامج البدء: /path/example 
حجم a = 21 
[العملية الأدنى 1 (العملية 14290) خرجت بشكل طبيعي]

يقوم GDB بطباعة الناتج printfعلى الشاشة، ثم يخبر المستخدم أن البرنامج خرج بشكل طبيعي.

انظر أيضا

مراجع

  1. ^ Joël Brobecker (7 يوليو 2024). "إصدار GDB 15.1!" . تم الاسترجاع في 9 يوليو 2024 .
  2. ^ "GDB Documentation - Supported Languages". مؤرشف من الأصل في 2017-12-28 . تم الاسترجاع في 2011-11-28 .
  3. ^ "GDB Documentation - Summary". مؤرشف من الأصل في 2012-07-01 . تم الاسترجاع في 2011-11-28 .
  4. ^ ab "محاضرة ريتشارد ستالمان في المعهد الملكي للتكنولوجيا، السويد (1986-10-30)" . تم الاسترجاع في 2006-09-21 . بعد أن أصبح GNU Emacs مستقرًا بشكل معقول، وهو ما استغرق في المجمل حوالي عام ونصف، بدأت في العودة إلى أجزاء أخرى من النظام. لقد طورت مصحح أخطاء أسميته GDB وهو مصحح أخطاء رمزي لكود C، والذي دخل مؤخرًا إلى التوزيع. الآن هذا المصحح يتوافق إلى حد كبير مع روح DBX، وهو مصحح أخطاء يأتي مع Berkeley Unix.
  5. ^ "جون جيلمور (ناشط)". hyperleap.com . مؤرشف من الأصل في 2021-02-26 . تم الاسترجاع 2020-10-13 .
  6. ^ "لجنة توجيه GDB" . تم الاسترجاع في 11 مايو 2008 .
  7. ^ "GDB Documentation - Summary - Contributors". مؤرشف من الأصل في 2011-09-29 . تم الاسترجاع في 2011-12-01 .
  8. ^ "ملاحظات إصدار GDB 7.0" . تم الاسترجاع في 2011-11-28 .
  9. ^ Joel Brobecker (2014-07-29). "إصدار GDB 7.8!" . تم الاسترجاع في 2014-07-30 .
  10. ^ "التصحيح العكسي باستخدام GDB" . تم الاسترجاع في 2014-01-20 .
  11. ^ "كيفية: بروتوكول GDB التسلسلي البعيد: كتابة خادم RSP" (PDF) .
  12. ^ "تنفيذ جزء بعيد".
  13. ^ "استكشاف أخطاء Kernel باستخدام Dcons".
  • الموقع الرسمي
  • UltraGDB: تصحيح أخطاء Visual C/C++ باستخدام GDB على Windows وLinux محفوظ في 12 ديسمبر 2017 على موقع Wayback Machine
  • KGDB: مصحح أخطاء مستوى مصدر نواة Linux
  • الموقع الإلكتروني لـ "MyGDB: GDB Frontend" باللغة الكورية
  • مكون إضافي لبرنامج Visual Studio لتصحيح الأخطاء باستخدام GDB
  • مقارنة بين واجهات GDB الأمامية، 2013
  • استخدام Eclipse كواجهة أمامية لبرنامج GDB Debugger

التوثيق

دروس تعليمية

تم الاسترجاع من "https://en.wikipedia.org/w/index.php?title=GNU_Debugger&oldid=1254334908"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate