كيفية العثور على سبب خطأ التجزئة في C++

Kyfyt Al Thwr Ly Sbb Khta Altjzyt Fy C



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

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

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







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

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



مصحح أخطاء GDB

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



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





العثور على خطأ التجزئة في C++ باستخدام GDB

فيما يلي مثال لمقتطف التعليمات البرمجية الذي يتسبب في حدوث خطأ في التجزئة:

#تشمل

كثافة العمليات رئيسي ( ) {

كثافة العمليات * بتر = nullptr ;

* بتر = 5 ;

يعود 0 ;

}

دعونا أولا شرح الكود. ثم سنناقش في خطوات العثور على خطأ التجزئة في الكود السابق.



يضيف توجيه المعالج المسبق '#include ' ملف رأس المطلوب الذي يوفر الإدخال بالإضافة إلى خصائص دفق الإخراج في C++.

يوجد داخل الدالة main() تعريف لمتغير المؤشر 'ptr' من النوع int*. ويتم استخدام القيمة 'nullptr' كتهيئة للمؤشر وهي قيمة مؤشر فارغة خاصة تشير إلى أنه لا يشير إلى أي نقطة. موقع الذاكرة صالح.

يتم إجراء محاولات إلغاء المرجع باستخدام المؤشر الفارغ 'ptr' في السطر التالي وهو '*ptr = 5;'. في هذه الحالة، بما أن 'ptr' تم ضبطه على 'nullptr'، فلا يوجد موقع ذاكرة صالح للوصول إليه.

الآن، سوف نناقش بعض الخطوات التي يجب اتباعها لتجميع البرنامج من أجل العثور على خطأ التجزئة.

الخطوة 1: تمكين رموز التصحيح

للبدء، تأكد من ترجمة برنامج C++ الخاص بك باستخدام رموز التصحيح الممكّنة. لتوفير معلومات التصحيح للملف القابل للتنفيذ أثناء الترجمة، استخدم العلامة '-g'. خذ بعين الاعتبار الحالة التي يكون لدينا فيها ملف C++ يسمى 'main.cpp'.

$ ز++ main.cpp -O رئيسي

الخطوة 2: تشغيل GDB

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

$ gdb رئيسي

الخطوة 3: ابدأ البرنامج

ابدأ البرنامج بكتابة 'run' أو 'r' في موجه GDB:

$ ( gdb ) يجري

سيبدأ برنامجك بعد ذلك في التنفيذ.

الخطوة 4: تحديد خطأ التجزئة

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

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

عند تشغيل هذا البرنامج مع GDB، سترى مخرجات مشابهة لما يلي:

يشير هذا الإخراج إلى حدوث خطأ تجزئة في الوظيفة الرئيسية في السطر 5 من الملف 'main.cpp'.

الخطوة 5: فحص تتبع المكدس

للحصول على مزيد من المعلومات حول خطأ التجزئة، يمكنك فحص تتبع المكدس باستخدام أمر 'backtrace' أو ببساطة 'bt'. يعرض هذا الأمر تسلسل استدعاءات الوظائف التي تؤدي إلى التعطل.

$ ( gdb ) بريتيش تيليكوم

يتم عرض تتبع المكدس الذي يشير إلى الوظائف التي تم استدعاؤها قبل خطأ التجزئة:

يخبرنا هذا الإخراج أن خطأ التجزئة حدث في الوظيفة الرئيسية في السطر 5 من الملف 'main.cpp'.

الخطوة 6: تعيين نقاط التوقف

لمزيد من التحقيق، يمكنك تعيين نقاط التوقف عند أسطر محددة من التعليمات البرمجية لإيقاف تنفيذ البرنامج عند تلك النقاط. يتيح لك ذلك فحص حالة البرنامج ومتغيراته. على سبيل المثال، لتعيين نقطة توقف عند السطر 5 من 'main.cpp'، استخدم الأمر 'break' كما يلي:

$ ( gdb ) استراحة main.cpp: 5

يؤدي هذا إلى تعيين نقطة توقف عند السطر 5 من ملف 'main.cpp':

الخطوة 7: استئناف التنفيذ

بعد تحديد نقاط التوقف، استأنف تنفيذ البرنامج باستخدام أمر 'متابعة' أو ببساطة 'c':

$ ( gdb ) يكمل

يستمر البرنامج في العمل حتى يصل إلى نقطة التوقف.

الخطوة 8: فحص المتغيرات والتعليمات البرمجية

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

الخطوة 9: قم بإنهاء GDB

بمجرد الانتهاء من تصحيح الأخطاء، يمكنك الخروج من GDB باستخدام الأمر 'quit':

$ ( gdb ) يترك

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

خاتمة

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