Rust: 特性オブジェクトのデバッグ表現を追加します

作成日 2012年01月19日  ·  28コメント  ·  ソース: rust-lang/rust

更新された説明

トレイトオブジェクト( ~Tおよび@T 、ここでTはトレイト)は、実装を非表示にし、仮想メソッドディスパッチテーブル(つまりvtable)を運ぶオブジェクトです。

したがって、2つのことがあります。

  1. デバッガーは、抽象化の障壁を回避して、隠された実装を確認できるようにしたいと思うでしょう。
  2. また、vtableを表示できるようにしたいと考える可能性もあります。

    • gdbのデバッグ形式がどれほど柔軟かはわかりませんが、新しいバージョンのgdbは、C ++オブジェクトのvtableの印刷をサポートしています( info vtblまたはおそらくinfo vtable介して)。 gdbが同じ方法でvtableも出力できるように、デバッグ情報をマッサージできれば素晴らしいと思います。

元の説明

なにもない。

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これは特に@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-lowP-medium両方になりました

P-mediumの削除

私は最近これを少し調べました。 私がしたいのは:

  • 放出される各vtableを説明するDWARFを放出します。 これは、vtableの型(関数へのポインターの構造体として)、vtableの場所、およびそのvtableによって表される具体的な型を記述します(おそらくDW_AT_containing_typeはこれに転用できます)。
  • 特性オブジェクトポインタの内部についてさらに説明します。 DWARFは特定の関数のvtableスロットを計算する方法を説明していますが、「オブジェクトのこのメンバーはvtableである」ことを示す方法がないように思われるため、現在、これは少しハックする必要があると思います。 。

次に、デバッガーは次の操作を実行して、特性オブジェクトポインターを出力できます。値の型に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の完全な説明を出力させることです。つまり、各メンバーのタイプと名前です。

このページは役に立ちましたか?
0 / 5 - 0 評価