سؤال

هل هناك أي خيار gcc يمكنني تعيينه ليعطيني رقم السطر الخاص بخطأ التجزئة؟

أعلم أنني أستطيع:

  1. تصحيح الأخطاء سطرًا تلو الآخر
  2. ضع printfs في الكود لتضييق نطاقه.

التعديلات:

  1. bt / where على gdb لا تعطي المكدس.
  2. اقتراح مفيد
هل كانت مفيدة؟

المحلول

لا أعرف خيار gcc، ولكن يجب أن تكون قادرًا على تشغيل التطبيق باستخدام gdb ثم عندما يتعطل، اكتب where لإلقاء نظرة على المكدس عند خروجه، والذي يجب أن يجعلك قريبًا.

$ gdb blah
(gdb) run
(gdb) where

تعديل للاكتمال:

يجب عليك أيضًا التأكد من إنشاء التطبيق باستخدام علامات التصحيح عند استخدام -g خيار gcc لتضمين أرقام الأسطر في الملف القابل للتنفيذ.

خيار آخر هو استخدام bt أمر (التتبع الخلفي).

نصائح أخرى

إليك جلسة Shell/gdb كاملة

$ gcc -ggdb myproj.c
$ gdb a.out
gdb> run --some-option=foo --other-option=bar
(gdb will say your program hit a segfault)
gdb> bt
(gdb prints a stack trace)
gdb> q
[are you sure, your program is still running]? y
$ emacs myproj.c # heh, I know what the error is now...

قرصنة سعيدة :-)

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

والشيء الجميل في هذا هو أنه يمكنك فقط تركه في التعليمات البرمجية الخاصة بك؛لا تحتاج إلى تشغيل الأشياء من خلال gdb للحصول على مخرجات التصحيح الرائعة.

إذا قمت بالتجميع باستخدام -g واتبعت الإرشادات الموجودة هناك، فيمكنك استخدام أداة سطر الأوامر مثل addr2line للحصول على معلومات الملف/الخط من الإخراج.

قم بتشغيله تحت valgrind.

تحتاج أيضًا إلى البناء باستخدام علامات التصحيح على -g

يمكنك أيضًا فتح التفريغ الأساسي باستخدام gdb (تحتاج إلى -g بالرغم من ذلك).

إذا كانت جميع الاقتراحات السابقة للتجميع باستخدام تصحيح الأخطاء (-g) والتشغيل ضمن مصحح الأخطاء (gdb، run، bt) لا تعمل لصالحك، فعندئذٍ:

  • ابتدائي:ربما لا تعمل تحت مصحح الأخطاء، بل تحاول فقط تحليل التفريغ الأساسي بعد الوفاة.(إذا بدأت جلسة تصحيح الأخطاء، لكن لم تقم بتشغيل البرنامج، أو إذا تم الخروج منه، فعندما تطلب التتبع العكسي، سيقول gdb "لا يوجد مكدس" - لأنه لا يوجد برنامج قيد التشغيل على الإطلاق.لا تنس أن تكتب "تشغيل".) إذا كان مقسمًا، فلا تنس إضافة الوسيطة الثالثة (core) عند تشغيل gdb، وإلا فإنك تبدأ بنفس الحالة، ولا ترتبط بأي عملية معينة أو صورة ذاكرة.
  • صعب:إذا كان برنامجك يعمل/كان قيد التشغيل بالفعل ولكن gdb الخاص بك يقول "لا يوجد مكدس" فربما يكون مؤشر المكدس الخاص بك قد تحطم بشدة.في هذه الحالة، قد تكون هناك مشكلة تجاوز سعة المخزن المؤقت في مكان ما، وهي مشكلة خطيرة بما يكفي لدمج حالة وقت التشغيل لديك بالكامل.يدعم الإصدار 4.1 من مجلس التعاون الخليجي برنامج ProPolice "Stack Smashing Protector" الممكّن معه -fstack-protector-all.ويمكن إضافته إلى مجلس التعاون الخليجي 3.x مع التصحيح.

لا توجد طريقة لـGC لتقديم هذه المعلومات، سيتعين عليك الاعتماد على برنامج خارجي مثل GDB.

يمكن أن يمنحك GDB السطر الذي حدث فيه العطل باستخدام الأمر "bt" (اختصار لـ "backtrace") بعد حدوث خطأ في البرنامج.لن يمنحك هذا سطر العطل فحسب، بل مجموعة البرنامج بأكملها (حتى تتمكن من رؤية ما يسمى الوظيفة التي حدث فيها العطل).

ال No stack يبدو أن المشكلة تحدث عند خروج البرنامج بنجاح.

للعلم، واجهتني هذه المشكلة لأنني نسيت عائدًا في الكود الخاص بي، مما جعل برنامجي يخرج برمز الفشل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top