مصحح جنو
المحتويات

في البداية، مصحح جنو أو اختصارا GBD، هو مصحح متوفر لنظام جنو. وهو مصحح نقال يعمل على الكثير من الأنظمة الشبيهة بيونكس، ويعمل مع الكثير من لغات البرمجة، مثل أدا، وسي++، وسي الكائنية، وفري باسكال، وفورتران، وجافا، كما يعمل جزئيًا مع لغات أخرى. وتعرض الأقسام التالية جوانب أخرى من الموضوع.
سطر الأوامر
0x0000000000400527 in foo_len (s=0x0) at example.c:8
8 return strlen (s); (هنا يقول لنا أين الخطأ)
exit( 0 );
إضافةً إلى ذلك، }بإعادة التحويل البرمجي لترجمة الرمز البرمجي، وإعادة تنفيذه داخل مصحح جنو الآن يعطينا النتائج الصحيحة.GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)
Copyright (C) 2011 Free Software Foundation, Inc.
كذلك، License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it.
- This GDB was configured as "x86_64-redhat-linux-gnu".
- For bug reporting instructions, please see:
- ...
- Reading symbols from /path/example...done.
- (gdb) run
- Starting program: /path/example
وفي هذا السياق، There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details.
{
const char *a = "This is a test string";
printf( "size of a = %lu\n", foo_len(a) );
Starting program: /path/example
Program received signal SIGSEGV, Segmentation fault.
gdb ***
run
بدء التنقيح
من جهة ثانية، تنقيح برنامج، استبدل *** بمسار البرنامج أو بملف القلب أو بمعرف العملية (process ID)
#include
- size_t foo_len( const char *s )
- {
- return strlen( s );
attach ***
- detach
- إنهاء تنقيح المهمة
- GDB Documentation
- أمثلة لأوامر مصحح جنو
كذلك، تنقيح مهمة (المهمة هي أي برنامج يعمل في الذاكرة), استبدل *** بمعرف العملية (process ID)
(gdb) print s
- Copyright (C) 2011 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later
- This is free software: you are free to change and redistribute it.
- There is NO WARRANTY, to the extent permitted by law. Type "show copying"
- and "show warranty" for details.
- This GDB was configured as "i686-pc-linux-gnu".
- For bug reporting instructions, please see:
- ...
- Reading symbols from /tmp/gdb/example...done.
- (gdb) run
وفي هذا الصدد، $1 = 0x0المشكلة تظهر في السطر الثامن، وتحدث عند استدعاء الدالة (الوظيفة) strlen (لأن حجتها s ، لا شيء) (because its argument, s, is NULL)، الخارج يمكن أن يكون مختلف، وذلك يعود إلى الدالة strlen (هل مضمنة أم لا)، عل سبيل المثال:GNU gdb (GDB) 7.3.1
Starting program: /tmp/gdb/example
- Program received signal SIGSEGV, Segmentation fault.
- 0xb7ee94f3 in strlen from /lib/i686/cmov/libc.so.6
- (gdb) bt
- #0 0xb7ee94f3 in strlen from /lib/i686/cmov/libc.so.6
أمثلة تطبيقية
#include
ومن جهة أخرى، لنأخد بعين الإعتبار الرمز البرمجي المصدري هذا، المكتوب بلغة C:#include
#include
- size_t foo_len( const char *s )
- {
- return strlen(s);
exit( 0 );
- GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)
- Copyright (C) 2011 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later
- This is free software: you are free to change and redistribute it.
- There is NO WARRANTY, to the extent permitted by law. Type "show copying"
- and "show warranty" for details.
- This GDB was configured as "x86_64-redhat-linux-gnu".
- For bug reporting instructions, please see:
- ...
- Reading symbols from /path/example...done.
- (gdb) run
ومن ناحية أخرى، Segmentation fault (خطأ في التجزئة)بما أن الرمز البرمجي في المثال عند تنفيذه يعطينا خطأ في التجزئة (segmentation fault)، مصحح جنو يمكن استعماله لتفقد المشكلة:$ gdb ./example
وفي هذا الصدد، }باستعمال مجموعة مترجمات جنو في نظام لينكس، يجب معالجة الرمز البرمجي أعلاه باستخدام عَلم -g لضمان تضمين معلومات التصحيح المناسبة على ملف نظام العد الثنائي (الباينري) الذي تم إنشاؤه. مما يجعل من الممكن فحصها باستخدام مصحح جنو، بافتراض أن الملف الذي يحتوي على الرمز البرمجي أعلاه مسمى باسم ecample.c، أمر التحويل البرمجي لمعالجة الملق يجب أن تكون كالتالي:$ gcc example.c -Og -g -o exampleويمكننا الآن تشغيل ملف الثنائية (binary) بالشكل التالي:$ ./example
const char *a = NULL;
printf( "size of a = %lu\n", foo_len(a) );
#1 0x08048435 in foo_len (s=0x0) at example.c:8
#include
وفي السياق ذاته، #2 0x0804845a in main (argc=, argv=) at example.c:16لإصلاح المشكل، يجب أن يكون المتغير a على قيمة صالحة (في الدالة main). النسخة الصالحة للرمز البرمجي كالتالي:#include
}
{
int main( int argc, char *argv[] )
}
int main( int argc, char *argv[] )
تاريخ
كذلك، من سنة 1990 إلى سنة 1993 مصحح جنو كان مصان بواسطة جون جيلمور (John Gilmore). أما الآن فهو تابع إلى لجنة تسيير مصحح جنو التي أوجدت بواسطة مؤسسة البرامج الحرة (Free Software Foundation).
في هذا الإطار، مصحح جنو صنع أول مرة بواسطة ريتشارد ستولمن في سنة 1986 كجزء من نظامه جنو، بعد أن كان جنو اماكس (GNU Emas) «مستقر بشكل جيد». مصحح جنو برنامج مجاني أصدر تحت ترخيص رخصة جنو العمومية «جي بي ال» (GNU General Public License GPL). صُمم على غرار مصحح «دي بي اكس» (DBX)، الذي أتى مع توزيعات بيركيلي يونيكس.
size of a = 21
وصلات خارجية
المراجع
إضافةً إلى ذلك، [Inferior 1 (process 14290) exited normally] (انتهى بشكل طبيعي)مصحح جنو يطبع خارج دالة printf في الشاشة، ثم يخبر المستعمل أن البرنامج انتهى بشكل طبيعي.
📝 هل في هذه المقالة خطأ؟
إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.
ما رأيك في هذه المقالة؟