3

GDB内の複雑なオブジェクトを監視するためにそれらを使用するためのスクリプトまたはコードを作成する簡単な方法はありますか?私が考えることができることの1つは、その目的のためにコードに特別な関数を持ち、を介してそれらを直接呼び出すことcall debugViewer(object)です。これを行うためのより良い方法はありますか?

Qt Creatorのようなビジュアルデバッガーを使用して、これをどのように異なる方法で行いますか?

4

2 に答える 2

3

私はGDB用のDDDグラフィカルインターフェイスを使用しています。これは、「複雑なオブジェクト」と呼ばれるものを表示するように特別に設計されています。ただし、そうは言っても、dbg()メソッドは、オブジェクトのコンテンツをstdoutに出力できるだけでなく、stdoutにも出力できるという利点があるため、些細なクラス/構造体以外でdbg()メソッドをコーディングする方がよい場合が多いと思います。所有/接続されたオブジェクトが期待される状態にあることの確認など、カスタムオブジェクトの整合性チェックを実行します。「詳細」フラグを渡さない限り、有効であることがわかっている情報を非表示にすることができますが、通常はデバッグには役立ちません(または冗長のための別の機能があります)。GDBコマンドラインからメソッドを簡単に呼び出せるようにするために、目的のオブジェクトのdbg()メソッドへのポインターを受け取る非メンバーメソッドを作成しました。

また、整合性チェックに関しては、実際にはあなたの質問とは関係ありませんが、誰かがstd :: string、std :: list、std :: mapなど(通常は「パフォーマンス上の理由」)、彼らは常に何か間違っている、通常はテストが難しいヘアリーエッジの場合を除いて表示されない何かを取得します。データ構造クラス全体(リストやツリーなど)をクロールするだけのデータ構造クラスのデータ構造整合性テスターフレンドクラスを作成することで、このような実装における複数のヘアリーエッジケースのバグを3回発見しました。 )最後まで、古くなった/破損したポインタを探します(つまり、リスト内で、「next->prev」が「this」または「prev->next」が「等しくない」ものを探します。これ」など)。データ構造の1つは、煩わしいコンボリストグラフ(DAGが埋め込まれたリスト)でした。これは、トラブルシューティングが非常に楽しかったです。...別々のリスト間でいくつかのスプライス/転送アクションを実行した後、ねじ込む機会がたくさんあります。リンクを上に移動し、一方のリストでDAGを取得して、もう一方のリストのノードを参照します。整合性チェッカーを作成してヘアリーエッジケースのバグを見つける前に、構造がほぼ1年間内部で使用されていたのは驚くべきことです。

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

于 2012-05-10T17:22:19.207 に答える
0

gdbの優れたGUIである「Insight」を使用してみることができます。

GDBGUIインサイト

于 2012-05-18T17:07:49.740 に答える