Rust: أضف تمثيل التصحيح لكائنات السمات

تم إنشاؤها على ١٩ يناير ٢٠١٢  ·  28تعليقات  ·  مصدر: rust-lang/rust

الوصف المحدث

كائنات السمات ( ~T و @T حيث T هي سمة) هي كائنات تخفي تنفيذها وتحمل جدول إرسال أسلوب افتراضي (مثل vtable).

إذن ، هناك شيئان:

  1. سيريد المصححون أن يكونوا قادرين على تجاوز حاجز التجريد ورؤية التنفيذ الخفي.
  2. من المحتمل أيضًا أن يرغبوا في أن يكونوا قادرين على رؤية الجدول vtable.

    • لست متأكدًا من مدى مرونة تنسيق تصحيح الأخطاء لـ gdb ، لكن الإصدارات الأحدث من gdb تدعم طباعة vtable لكائنات C ++ (عبر info vtbl أو ربما info vtable ). سيكون من الرائع لو تمكنا من تدليك معلومات تصحيح الأخطاء الخاصة بنا حتى يتمكن gdb من طباعة vtables الخاصة بنا أيضًا ، بنفس الطريقة.

الوصف الأصلي

لا يوجد.

A-debuginfo C-feature-request P-low T-compiler

التعليق الأكثر فائدة

أول نجاح اليوم:

(gdb) p tu
$1 = traitobjtest::&T {pointer: 0x7fffffffe047 "\027\070\340\377\377\377\177\000", vtable: 0x5555555c34e8 <vtable> "\360\253UUUU\000"}
(gdb) p *tu
$2 = 23

ال 28 كومينتر

ماذا سيكون تمثيل التصحيح للسمة؟ أعتقد أن السمة هي كيان وقت تجميع بحت يتم محوه بحلول الوقت الذي تصل فيه إلى وقت التشغيل.

jdm هل هذا مخصص لكائنات فسأقوم بمسح عنوان الخطأ ووصفه.

نعم ، أعتقد أن تحديد نطاق هذا لتغطية كائنات السمات (من الصنف ~ و @) سيكون جيدًا.

وفقًا لـ middle/trans/debuginfo.rs : cx.sess.span_note(span, "debuginfo for trait NYI");

على سبيل المثال ، هذا لا يزال ساريًا ، وموسم ومُحدد بشكل صحيح ، 2013-06-19

زيارة الفرز التأجيل إلىmichaelwoerister.

زيارة الفرز التأجيل إلىmichaelwoerister.

لا يزال NYI ولكن يجب معالجته في وقت ما هذا الشهر.

تحديث:

اعتبارًا من PR # 9168 ، يوجد بعض الدعم الأساسي لكائنات السمات. يوصف مؤشر كائن سمة على أنه بنية بالحجم الصحيح (مؤشرين) والاسم الصحيح ({sigil} {mutability} {اسم سمة}) ويتم وضعه في مساحة الاسم الصحيحة. لم يتم وصف الجزء الداخلي لمؤشر الدهون هذا بعد. ما ينقص هو وصف طرق السمة. لا أعرف ما يكفي عن كيفية تنفيذها فعليًا لأقول الكثير عن ذلك.

ليس 1.0 ، لكنه مرتفع

michaelwoerister : بالمناسبة ، تخطيط vtable الجديد هو [drop_glue, method, method2, method3, ...] . أنا متأكد من أن هذا سيتغير في المستقبل بطريقة ما عندما تصبح الأساليب فوق الرأسية قابلة للاستدعاء على كائنات السمات.

أصبح هذا الأمر أكثر تعقيدًا مع التوقيت الصيفي نظرًا لأنه يمكنك الحصول على كائنات مثل Fat<Trait> حيث Fat عبارة عن هيكل DST. لقد تم كسر رمز كعب الروتين الخاص بكائنات السمات قليلاً ، لكنني لا أريد إصلاحه لأنه مجرد كعب. تركت FIXME هناك.

نتوء الفرز: لست متأكدًا من حالة هذا اليوم.

لا يزال بحاجة إلى القيام به

يمكننا القيام بما يلي:
(1) قم بإنشاء أوصاف نوع لكل سمة تحتوي على الطرق التي تحددها. نظرًا لعدم وجود سمات في معيار DWARF حتى الآن ، فإن استخدام DW_AT_interface سيكون أكثر منطقية. ولكن ربما يكون استخدام DW_AT_struct أكثر توافقًا مع مصححات الأخطاء الموجهة نحو C.

(2) صِف مؤشرات السمات ( &Trait et al) على شكل مجموعات من النوع (*(), *OpaqueVTable<Trait>)

(3) قم بتنفيذ أوامر GDB / LLDB المخصصة في لغة Python التي تستخدم قيمة المؤشر واكتب المعلومات لطباعة vtable ، وذلك باستخدام مؤشر سمين.

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

فقط في الإصدارات التي تحتوي على معلومات تصحيح الأخطاء (على سبيل المثال ، ليست إصدارات الإصدارات) وفقط بكمية ضئيلة جدًا

الفرز: لا يزال بحاجة إلى القيام به. سم مكعبManishearthtromey P منخفضة

هذا هو P-low و P-medium الآن

إزالة ف المتوسطة

لقد بحثت في هذا قليلا مؤخرا. ما أتمنى أن أفعله هو:

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

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

أنا أعمل على هذا. لديّ تصحيح LLVM للسماح لـ rustc بإصدار امتداد DWARF صغير (الفكرة DW_AT_containing_type ) ؛ تصحيح rustc لإصدار أساسيات vtable (العنوان والنوع المحتوي ، وليس إرسال الطرق) ، ومعظم التصحيح gdb لقراءته كلها وجعل print يعمل.

أول نجاح اليوم:

(gdb) p tu
$1 = traitobjtest::&T {pointer: 0x7fffffffe047 "\027\070\340\377\377\377\177\000", vtable: 0x5555555c34e8 <vtable> "\360\253UUUU\000"}
(gdb) p *tu
$2 = 23

مثير!

انتقل إلى phabricator ؛ قد يكون من الأسهل المتابعة هناك أيضًا: https://reviews.llvm.org/D39503

يتوفر تصحيح gdb لطباعة كائنات السمات هنا: https://sourceware.org/ml/gdb-patches/2017-11/msg00289.html

يمكن عمل الجزء 2 من خلال وصف حقول الجدول vtable. لم ألقي نظرة على البتات الصدئة لأرى مدى صعوبة ذلك حتى الآن. البتات info vtbl في gdb ليست صعبة ، في الغالب تقوم فقط بإضفاء الطابع الافتراضي على الأمر الحالي. مع وجود أسماء الحقول الصحيحة هناك ، يبدو أن تنفيذ استدعاءات الطريقة على كائنات السمات يجب أن يكون واضحًا أيضًا.

الإصدار 2 من تصحيح gdb موجود هنا: https://sourceware.org/ml/gdb-patches/2017-11/msg00369.html

تصحيح gdb قيد التشغيل الآن ، لكنني أعتقد أنه يجب ترك هذه المشكلة مفتوحة ، حيث لا تزال هناك مهمة vtable الأخرى التي يجب تنفيذها.

tromey هل تتطلب "مهمة vtable" تغييرات في gdb أو تغييرات rustc فقط؟

tromey هل تتطلب "مهمة vtable" تغييرات في gdb أو تغييرات rustc فقط؟

من الناحية المثالية أعتقد أنه سيتطلب كليهما ؛ ومع ذلك ، فإن مجرد عمل البتات الصدئة سيكون بداية جيدة (وهذا يجب أن يأتي أولاً على أي حال). المهمة هنا هي جعل rustc يصدر وصفًا كاملاً للجدول vtable في DWARF - لذلك ، نوع واسم كل عضو.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات