c - ترجمة - معنى كلمة عنوان بالانجليزي




ما الذي يمكن أن يجعل غب يرفض كسر؟ (3)

أنا في خسارة هنا. أنا أكتب مترجم في C (للهواية)، وتجميع مع دول مجلس التعاون الخليجي 4.6.1 على amd64 لينكس 2.6.32، وذلك باستخدام غب 7.3. الأعلام هي "-Wall -Wextra -O0 -g"، بالإضافة إلى المعتاد -I و واتنوت. لدي وظيفة التي تهدف إلى الإبلاغ عن خطأ تحليل، كما هو محدد على النحو التالي:

void cerror_at (struct lex *lex, struct token *tok, const char *fmt, ...)

بخلاف كونها فاريديك، لا شيء غريب. المشكلة هي أن غب لن كسر في ذلك. لقد حاولت كل طريقة يمكن أن أفكر في (نقطة التوقف في وظيفة، داخل وظيفة، قبل أن يطلق عليه، سمها ما شئت)، ولكن حالما يكون برنامجي داخل الدالة، أحصل على رسائل مثل "تحذير: خطأ إزالة نقطة توقف 0 "و غب يتيح فقط إنهاء البرنامج. ليس هناك شيء خاطئ مع ذلك أكثر من ذلك (لقد قمت منذ إصلاح الخلل كنت أحاول العثور على، وكل شيء يعمل كما ينبغي)، ولكن لا أستطيع أن ندخل في وظيفة. أي أفكار حول ما يمكن أن يسبب هذا؟

تحرير: مزيد من المعلومات! يقوم غب بتحديد نقطة التوقف عند 0x403057. تبدأ الدالة عند 0x403025. نظرة على هذا الجزء من التفكيك:

0x0000000000403053 <+46>:   test   %al,%al
0x0000000000403055 <+48>:   je     0x403077 <cerror_at+82>

عند هذه النقطة، فإنه يتخطى إلى 0x403077 (الماضي نقطة التوقف). لقد تحققت من أن وضع نقطة التوقف في عنوان قبل "جي" يعمل، وكذلك على عنوان في أو بعد 0x403077، الهدف من القفزة، ولكن ليس بين (حيث غب يحاول وضعه). لماذا غب وضع نقطة التوقف في منتصف وظيفة؟ حتى غب يقول لي أن عنوان الوظيفة هو، في الواقع، 0x403025.


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

قد حاولت تجربة مع -gdwarf-4 ، -gdwarf-3 ، أو حتى -gdwarf-2 لمعرفة ما اذا كان يجعل أي فرق.

إذا كنت يمكن أن تقلل من ذلك إلى حالة اختبار بسيط، وأظن أن مطوري غك قبوله كخلل.

وبطبيعة الحال، يمكن أن يكون هذا أيضا خلل في غب. ولكن نظرا لهذا السلوك، وأعتقد أن هذا هو أقل احتمالا.


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

  1. التعليمات البرمجية التي أحاول تصحيح لا يطابق تماما التعليمات البرمجية في المصحح.
  2. نسيت أن تجميع هذه المكتبة مع خيارات التصحيح.

تأكد من التحقق من كل من هذه في أي وقت تحصل على خطأ التصحيح مثل هذا، حتى لو كنت تعتقد انها ليست المشكلة.


هذا يبدو وكأنه علة في غب. على وجه الخصوص، Error removing breakpoint 0 هو مشبوهة جدا (انها نقطة غب نقطة الانطلاق إدراجها تلقائيا في مكان ما؛ نقاط دخول المستخدم المدرجة لها أرقام إيجابية).

ربما يجب عليك محاولة إنشاء حالة اختبار مخفضة وتقديم خطأ هنا .





gdb