لم تتبع المتغيرات المحلية في المنشئات. هل هذا خطأ في جدب؟

StackOverflow https://stackoverflow.com/questions/224090

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا حاليا بتشغيل جدب النسخة 6.7.1 على أوبونتو لينكس، والعمل في مشروع C ++.

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

وشكرا لأي معلومات ..

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

المحلول

وإنها علة في دول مجلس التعاون الخليجي، وليس في GDB.

وكان مؤخرا الثابتة .

نصائح أخرى

إذا كنت تستخدم الأمثل (-O)، تعطيله (إزالة -O أو استخدام -O0). المترجم أحيانا ذكية جدا والتخمينات متغير أنه لا حاجة، القيام بعمليات حسابية في وقت الترجمة، تغيير نطاق متغير، وأو العديد من الحيل الأخرى.

لاحظ أنه حتى مع "لا الأمثل"، لا تزال تفعل بعض التحسينات تافهة، لكنها يجب أن لا تتدخل كثيرا مع التصحيح. أيضا، مع استخدام مضمنة الثقيلة من C ++ (بما في ذلك STL)، يمكن أن البرنامج أصبح أبطأ بكثير دون الأمثل.

وهذا يبدو وكأنه كنت تصحيح بناء الأمثل.

والمصحح 'يعرف' قيمة المتغيرات المحلية لأن الملف رمز يصف موقعها في وظائف كومة الإطار.

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

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

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