トレイトオブジェクト( ~T
および@T
、ここでT
はトレイト)は、実装を非表示にし、仮想メソッドディスパッチテーブル(つまりvtable)を運ぶオブジェクトです。
したがって、2つのことがあります。
info vtbl
またはおそらくinfo vtable
介して)。 gdbが同じ方法でvtableも出力できるように、デバッグ情報をマッサージできれば素晴らしいと思います。なにもない。
トレイトのデバッグ表現は何でしょうか? トレイトは、実行時に消去される純粋なコンパイル時エンティティと考えています。
@jdmこれは特に@Traitオブジェクト用
はい、(〜および@の種類の)トレイトオブジェクトをカバーするためにこれをスコープすることは問題ないと思います。
middle/trans/debuginfo.rs
よると: cx.sess.span_note(span, "debuginfo for trait NYI");
つまり、これはまだ有効であり、適切にタグ付けされ、マイルストーンが付けられています、2013年6月19日。
トリアージ訪問; @michaelwoeristerに延期します。
トリアージ訪問; @michaelwoeristerに延期します。
それはまだNYIですが、今月中に取り組む必要があります。
PR#9168の時点で、トレイトオブジェクトの基本的なサポートがいくつかあります。 特性オブジェクトポインタは、正しいサイズ(2つのポインタ)と正しい名前({sigil} {mutability} {trait name})を持つ構造体として記述され、正しい名前空間に配置されます。 この「ファットポインター」の内部については、まだ説明していません。 欠落しているのは、トレイトのメソッドの説明です。 それらが実際にどのように実装されているかについては、それについて多くを語るのに十分なことはわかりません。
1.0ではないが高い
@michaelwoerister :ちなみに、新しいvtableレイアウトは[drop_glue, method, method2, method3, ...]
です。 将来、スーパートレイトメソッドがトレイトオブジェクトで呼び出せるようになると、これはどういうわけか変わると確信しています。
Fat
がDST構造体である場合、 Fat<Trait>
ようなオブジェクトを持つことができるため、これはDSTではより複雑になります。 特性オブジェクトのスタブコードはもう少し壊れていますが、それは単なるスタブであるため、修正したくありません。 そこにFIXMEを残しました。
トリアージバンプ:今日の状況がわからない。
まだやる必要があります
次のことができます。
(1)定義するメソッドを含む各トレイトのタイプの説明を作成します。 DWARF標準にはまだ特性がないため、 DW_AT_interface
を使用するのが最も理にかなっています。 ただし、 DW_AT_struct
を使用すると、C指向のデバッガーとの互換性が高くなる可能性があります。
(2)特性ポインター( &Trait
)をタイプ(*(), *OpaqueVTable<Trait>)
タプルとして記述します。
(3)PythonでカスタムGDB / LLDBコマンドを実装します。このコマンドは、ファットポインターが与えられた場合、ポインター値と型情報を使用してvtableを出力します。
それは完璧ではありませんが、現在利用可能な手段で行うことができます。 vtableが指す関数のシンボル名は、トレイトオブジェクトの実際の実行時タイプも示す必要があります。
デバッグ情報を含むビルド(つまり、リリースビルドではない)でのみ、ごくわずかな量でのみ
トリアージ:まだ実行する必要があります。 cc @Manishearth @tromey P-low
これはP-low
とP-medium
両方になりました
P-mediumの削除
私は最近これを少し調べました。 私がしたいのは:
DW_AT_containing_type
はこれに転用できます)。次に、デバッガーは次の操作を実行して、特性オブジェクトポインターを出力できます。値の型にvtableがある場合、下位からvtableをフェッチし、DWARFでvtableのアドレスを検索してvtable型を見つけ、具体的な型を使用してペイロードポインタをデコードします。
私はこれに取り組んでいます。 rustcに小さなDWARF拡張機能( DW_AT_containing_type
)のアイデアを出力させるためのLLVMパッチがあります。 vtableの基本(アドレスと包含タイプ、メソッドを出力しない)を出力するrustcパッチ、およびすべてを読み取ってprint
機能させるgdbパッチのほとんど。
今日の最初の成功:
(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
エキサイティング!
LLVMパッチはこちら: http :
phabricatorに移動しました。 そこにも従うほうが簡単かもしれません: https :
トレイトオブジェクトを印刷するためのgdbパッチはこちらです: https :
パート2は、vtableのフィールドを記述することで実行できます。 私はこれがどれほど難しいかを見るためにrustcビットを見ていません。 gdbのinfo vtbl
ビットは難しくありません。ほとんどの場合、既存のコマンドをもう少し仮想化するだけです。 そこに正しいフィールド名があれば、トレイトオブジェクトへのメソッド呼び出しの実装も簡単なはずです。
gdbパッチのバージョン2はここにあります: https :
gdbパッチは現在リリースされていますが、実装する他のvtableタスクがまだあるため、この問題は開いたままにしておく必要があると思います。
@tromey 「vtableタスク」にはgdbの変更が必要ですか、それともrustcの変更だけが必要ですか?
@tromey 「vtableタスク」にはgdbの変更が必要ですか、それともrustcの変更だけが必要ですか?
理想的には、両方が必要になると思います。 ただし、rustcビットを実行することは良いスタートです(そしてこれはとにかく最初に来なければなりません)。 ここでのタスクは、rustcにDWARFのvtableの完全な説明を出力させることです。つまり、各メンバーのタイプと名前です。
最も参考になるコメント
今日の最初の成功: