2012-05-09 3 views
3

GDB内の複雑なオブジェクトを見るためにスクリプトやコードを使用する簡単な方法はありますか?私が考えることの1つは、その目的のためにコード内に特別な機能を持たせて、call debugViewer(object)経由で直接呼び出すことです。これを行うためのより良い方法はありますか?gdbで複雑なオブジェクトを見るには?

Qt Creatorのような視覚的なデバッガを使ってどうやってやりますか?

+0

[リンク](http://stackoverflow.com/questions/10169974/cant -see-some-objects-internals-in-qt-creators-locals-and-expressions-debug-w) –

答えて

3

GDB用のDDDグラフィカルインターフェイスを使用します。これは、「複雑なオブジェクト」と呼ばれるものを表示するように特に設計されています。 dbg()メソッドはオブジェクトの内容をstdoutに出力できないという利点がありますが、簡単なクラス/構造体以外の方法でdbg()メソッドをコーディングする方が良いことがよくあります。所有/接続されたオブジェクトが期待どおりの状態にあることを確認するなど、カスタムオブジェクトの完全性チェックを行い、冗長フラグを渡さない限り、有効であるが、通常はデバッグに役立たない情報を隠すことができます冗長機能を持っていても構いません)。 GDBのコマンドラインからメソッドを呼び出すのを容易にするために、投稿で提案したように、目的のオブジェクトのdbg()メソッドへのポインタを取る非メンバメソッドを記述しました。

また、完全性チェックに関しては実際にあなたの質問には関係していませんが、誰かがstd :: string、std :: list、std :: mapなどのような機能を複製しようとすると、 (通常は「パフォーマンス上の理由」のため)、それらは常に間違ったものが得られます。通常、テストするのが難しい毛状のエッジケースを除き、表示されません。今度は3回、そのような実装では、データ構造全体のクロール(リストやツリーなど)を行うというデータ構造クラスのフレンドクラスのデータ構造完全性テスターを作成して、複数のヘアリーエッジのバグを発見しました。 )リストの中で、 'next-> prev'が 'this'または 'prev-> next'と等しくないものは 'this'と等しくない) 。データ構造の1つは侵入型のコンボリストグラフ(DAGが埋め込まれたリスト)でした。これはトラブルシューティングの面白さでした....複数のスプライス/転送アクションを別々のリストの間に実行した後、リンク&を他のリストのノードを参照する1つのリストで取得します。インテグリティチェッカーを書いて毛むくじゃらのエッジケースのバグを発見するまでに、構造が内部使用されて1年近く経っていたことは驚くべきことです。

申し訳ありませんが、私はあなたの質問についてではなかったと思いますが、とにかくそれについて噴出するのは楽しいことでした。

0

あなたこれでGDBの一見のための素敵なGUIである "インサイト" を使用して試すことができます:これは役立つかもしれない

GDB GUI Insight

関連する問題