سؤال

لدي المشكلة التالية مع برنامجي C: في مكان ما هو تجاوز سعة مكدس. على الرغم من الترجمة دون تحسين ورموز مصحح الأخطاء، فإن البرنامج يخرج مع هذا الإخراج (داخل أو خارج GDB على Linux):

تم إنهاء البرنامج بإشارة SIGSEGV، خطأ تجزئة. البرنامج لم يعد موجودا.

الطريقة الوحيدة التي يمكنني اكتشافها أن هذا هو الفائض في الواقع هو تشغيل البرنامج من خلال Valgrind. هل هناك أي طريقة يمكنني إجبار نظام التشغيل بطريقة أو بأخرى على تفريغ تتبع مكدس المكالمات الذي من شأنه أن يساعدني في تحديد المشكلة؟

للأسف، لا يسمح لي GDB بالاستفادة بسهولة في البرنامج أيضا.

هل كانت مفيدة؟

المحلول

إذا سمحت للنظام بتفريغ الملفات الأساسية، فيمكنك تحليلها مع GDB:

$ ulimit -c unlimited # bash sentence to allow for infinite sized cores
$ ./stack_overflow
Segmentation fault (core dumped)
$ gdb -c core stack_overflow
gdb> bt
#0  0x0000000000400570 in f ()
#1  0x0000000000400570 in f ()
#2  0x0000000000400570 in f ()
...

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

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

$ sysctl kernel.core_uses_pid=1

نصائح أخرى

مع GCC يمكنك تجربة هذا:

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

-fstack-protector-all
مثل -Fstack-حامي باستثناء أن جميع الوظائف محمية.

http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/optimize-options.html#optimize-options.

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

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