Rust: Tambahkan representasi debug dari objek sifat

Dibuat pada 19 Jan 2012  ·  28Komentar  ·  Sumber: rust-lang/rust

Deskripsi yang diperbarui

Objek sifat ( ~T dan @T mana T adalah sifat) adalah objek yang menyembunyikan implementasinya dan membawa tabel pengiriman metode virtual (yaitu vtable).

Jadi, dua hal:

  1. Debugger ingin dapat melewati penghalang abstraksi dan melihat implementasi tersembunyi.
  2. Mereka juga cenderung ingin dapat melihat tabel v.

    • Saya tidak yakin seberapa fleksibel format debug untuk gdb, tetapi versi gdb yang lebih baru mendukung pencetakan vtable untuk objek C++ (via info vtbl atau mungkin info vtable ). Akan lebih keren jika kita bisa memijat info debug kita sehingga gdb bisa mencetak vtables kita juga, dengan cara yang sama.

Deskripsi asli

Tidak ada.

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

Komentar yang paling membantu

Sukses pertama hari ini:

(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

Semua 28 komentar

Apa yang akan menjadi representasi debug dari suatu Sifat? Saya menganggap Trait sebagai entitas waktu kompilasi murni yang terhapus pada saat Anda mencapai runtime.

@jdm Apakah ini khusus untuk objek @Trait (dalam hal ini, ya, saya setuju kami ingin mengekspos vtable ke debugger?) Jika demikian, maka saya akan menghapus judul dan deskripsi bug.

Ya, saya pikir pelingkupan ini untuk menutupi objek sifat (dari ~ dan @ variasi) akan baik-baik saja.

Menurut middle/trans/debuginfo.rs : cx.sess.span_note(span, "debuginfo for trait NYI");

yaitu ini masih valid, diberi tag dan tonggak dengan benar, 2013-06-19.

Kunjungan triase; tunduk pada @michaelwoerister.

Kunjungan triase; tunduk pada @michaelwoerister.

Ini masih NYI tetapi harus ditangani beberapa waktu bulan ini.

Memperbarui:

Pada PR #9168 ada beberapa dukungan dasar untuk objek sifat. Pointer objek sifat dideskripsikan sebagai struct dengan ukuran yang benar (dua pointer) dan nama yang benar ({sigil}{mutability}{trait name}) dan ditempatkan di namespace yang benar. Bagian dalam "penunjuk gemuk" ini belum dijelaskan lebih lanjut. Apa yang hilang adalah deskripsi metode sifat itu. Saya tidak cukup tahu tentang bagaimana mereka benar-benar diterapkan untuk mengatakan banyak tentang itu.

Bukan 1.0, tapi tinggi

@michaelwoerister : Omong-omong, tata letak vtable baru adalah [drop_glue, method, method2, method3, ...] . Saya yakin ini akan berubah di masa depan entah bagaimana ketika metode supertrait menjadi dapat dipanggil pada objek sifat.

Ini menjadi lebih rumit dengan DST karena Anda dapat memiliki objek seperti Fat<Trait> mana Fat adalah struct DST. Kode rintisan untuk objek sifat sedikit lebih rusak, tetapi saya tidak ingin memperbaikinya karena itu hanya sebuah rintisan. Saya meninggalkan FIXME di sana.

Benjolan triase: tidak yakin apa statusnya hari ini.

masih perlu dilakukan

Kita bisa melakukan hal berikut:
(1) Buat deskripsi tipe untuk setiap sifat yang berisi metode yang ditentukannya. Karena belum ada ciri-ciri dalam standar DWARF, menggunakan DW_AT_interface adalah yang paling masuk akal. Tapi mungkin menggunakan DW_AT_struct lebih kompatibel dengan debugger berorientasi C kami.

(2) Jelaskan pointer sifat ( &Trait et al) sebagai tupel tipe (*(), *OpaqueVTable<Trait>) .

(3) Terapkan perintah GDB/LLDB khusus dengan Python yang, dengan penunjuk gemuk, gunakan nilai penunjuk dan ketik informasi untuk mencetak tabel v.

Itu tidak sempurna tetapi bisa dilakukan dengan sarana yang tersedia saat ini. Nama simbol dari fungsi yang ditunjuk oleh vtable juga harus menunjukkan tipe runtime sebenarnya dari objek sifat.

Hanya dalam build dengan info debug (yaitu, bukan build rilis) dan hanya dengan jumlah yang cukup kecil

Triage: masih perlu dilakukan. cc @Manisharth @tromey P-low

Ini P-low dan P-medium sekarang

Menghapus P-medium

Saya melihat ini sedikit baru-baru ini. Yang saya harapkan adalah:

  • Keluarkan beberapa DWARF yang menjelaskan setiap vtable yang dipancarkan. Ini akan menjelaskan tipe vtable (sebagai struct pointer-to-function), lokasi vtable, dan tipe konkret yang diwakili oleh vtable itu (mungkin DW_AT_containing_type dapat digunakan kembali untuk ini).
  • Lebih lanjut menggambarkan interior pointer objek sifat. Saat ini saya pikir ini harus dilakukan melalui sedikit peretasan, karena sementara DWARF menjelaskan cara untuk menghitung slot vtable fungsi yang diberikan, sepertinya tidak ada cara untuk menunjukkan "anggota objek ini adalah vtable" .

Kemudian debugger dapat melakukan hal berikut untuk mencetak penunjuk objek sifat: jika tipe nilai memiliki vtable, ambil vtable dari inferior, cari alamat vtable di DWARF untuk menemukan tipe vtable, lalu gunakan tipe konkret untuk memecahkan kode penunjuk muatan.

Saya sedang mengerjakan ini. Saya memiliki tambalan LLVM untuk membiarkan rustc memancarkan ide ekstensi DWARF kecil ( DW_AT_containing_type ); tambalan rustc untuk memancarkan dasar-dasar vtable (alamat dan tipe yang berisi, bukan memancarkan metode), dan sebagian besar tambalan gdb untuk membaca semuanya dan membuat print berfungsi.

Sukses pertama hari ini:

(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

Menyenangkan!

Pindah ke fabricator; mungkin lebih mudah untuk diikuti di sana juga: https://reviews.llvm.org/D39503

gdb patch untuk mencetak objek sifat ada di sini: https://sourceware.org/ml/gdb-patches/2017-11/msg00289.html

Bagian 2 dapat dilakukan dengan menggambarkan bidang dari vtable. Saya belum melihat bagian rustc untuk melihat betapa sulitnya ini. Bit info vtbl di gdb tidak sulit, kebanyakan hanya memvirtualisasikan perintah yang ada sedikit lebih banyak. Dengan nama bidang yang benar di sana, sepertinya menerapkan pemanggilan metode pada objek sifat juga harus mudah.

Versi 2 dari tambalan gdb ada di sini: https://sourceware.org/ml/gdb-patches/2017-11/msg00369.html

Tambalan gdb sudah masuk sekarang, tetapi saya pikir masalah ini harus dibiarkan terbuka, karena masih ada tugas vtable lain yang harus diterapkan.

@tromey apakah "tugas vtable" memerlukan perubahan gdb atau hanya perubahan rustc?

@tromey apakah "tugas vtable" memerlukan perubahan gdb atau hanya perubahan rustc?

Idealnya saya pikir itu akan membutuhkan keduanya; namun hanya melakukan bit rustc akan menjadi awal yang baik (dan bagaimanapun ini harus didahulukan). Tugas di sini adalah membuat rustc mengeluarkan deskripsi lengkap dari vtable di DWARF -- jadi, jenis dan nama setiap anggota.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat