2

私はC++で次のような構造体を持っています:

struct HeapBlock {
    char* data;
}

struct DataBlock {
    int size;
    HeapBlock hb;
}

これらはフレームワークの一部であり、他にもいくつかのメンバー、ヘルパーなどがありますが、これらは重要な部分です。これを Python GDB pretty-printer で次のように表示したいと思います。

NAME                  TYPE             VALUE
DataBlock:            DataBlock       "Size 2000 @ 0x445343"
  |--->size           int             2000
  |--->data           HeapBlock       {...}
        |--->[0]      char            0x34
        |--->[1]      char            0x45
        ....
        <more values>

これまでのところ、HeapBlock を別の子として表示することに失敗しました。イテレータを悪用して生成することに成功しました:

NAME                  TYPE             VALUE
DataBlock:            DataBlock      
  |--->size           int              2000
  |--->[0]            char             0x34
  |--->[1]            char             0x45
   ....
   <more values>

これは、のメソッドdb["size"]によって返された反復子からの最初の結果で を返し、次に次の結果のために を返すことによって行われました。DataBlockPrinterchildren()db["hb"]["data"]size

に別のプリンターを使用しようとしましたHeapBlocksが、問題は、HeapBlockそれがどれくらい大きいかがわからないことです。それは親(DataBlock)に格納されているため、HeapBlockプリンターは反復を停止するタイミングも知りません。

ここの一部として印刷されている場合、sizeフィールドをきれいなプリンターに渡すことは可能ですか?HeapBlockDataBlock

4

2 に答える 2

0

残念ながら、これを行う組み込みの方法はありません。gdb bugzilla でバグが公開されていると思います。

ハックでそれを行うことは可能かもしれません:DataBlockプリンターで、のアドレスとサイズをHeapBlockハッシュ テーブルに記録します。次に、HeapBlockプリンターはこれを調べることができます。もちろん、問題はキャッシュを無効にする方法を決定することの 1 つになります。オフハンドには良い方法が思い浮かびません :-( しかし、単純に無効にしない方がよいかもしれませんDataBlock。プリンターが破壊されたときに無効にすることを試みるかもしれません。gdb はこれが機能することを保証しませんが、実際には問題ないかもしれません。 .

于 2015-03-09T15:31:53.897 に答える