Gdbを使用したデバッグでは、STL/boostを使用するc ++コードはまだ悪夢です。 STLでgdbを使用したことがある人なら誰でもこれを知っています。たとえば、コード here の一部のデバッグセッションの実行例を参照してください。
チップを集めて痛みを軽減しようとしています。以下に収集したヒント(特に、どのヒントを使用していて、それらに推奨される変更があるか)についてコメントしてください。
Update:GDBには 新しいC++ブランチ があります。
たぶん、あなたが探していたような「ヒント」ではないかもしれませんが、C++&STLからC++&boost&STLへの数年の移行後の私の経験は、lot以前よりもGDBでの時間が短くなっています。私はこれをいくつかのことに帰します:
boost::bimap
は、LRUキャッシングロジックの一般的なパターンに最適です。 GDB時間の別のヒープがあります。boost::test
のAUTOマクロは、テストケースをセットアップするのが絶対的である( CppUnitよりも簡単 )ことを意味します。これは、デバッガーをアタッチする必要があるものに組み込まれるずっと前に、多くのものをキャッチします。boost::bind
テストのための設計を容易にします。たとえば、アルゴリズムはより一般的で、操作するタイプに縛られない場合があります。これにより、テストシム/プロキシ/モックオブジェクトなどへのプラグインが容易になります(これと、boostのテンプレートの素晴らしさにさらされると、これまで考えたことのないことを "テンプレート化"して、同様のテストの利点を得ることができます)。boost::array
。 「Cアレイ」パフォーマンス、デバッグビルドでの範囲チェック。あなたは見るかもしれません:
私はロギングを使用するのが最も簡単でほとんどのオプションだと思います(実際にデバッグプリントを使用していますが、それはポイントではないと思います)。最大の利点は、プログラムの実行ごとに何回でもあらゆるタイプのデータを検査し、テキストエディタで検索して興味深いデータを探すことができることです。これは非常に高速であることに注意してください。欠点は明らかです。ログに記録するデータとログを記録する場所を事前に選択する必要があります。ただし、これはそれほど深刻な問題ではありません。通常、コード内のどこで問題が発生しているのかを知っているからです(そうでない場合は、時々正気チェックを追加すれば、すぐにわかります)。
チェック/デバッグライブラリは優れていますが、テストツールとしては優れており(たとえば、実行して何か問題があるかどうかを確認します)、特定の問題のデバッグは得意ではありません。ユーザーコードの欠陥を検出することはできません。
それ以外の場合は、プレーンなGDBを使用します。 "print x
"が画面いっぱいにジャンクを印刷するのが怖いのかもしれませんが、それは聞こえるほど悪くはありません。ただし、デバッグ情報がある場合、std::vector
のメンバーの印刷などの作業が失敗し、何かが失敗した場合でも、x
コマンドで未加工メモリを検査できます。しかし、探しているものがわかっている場合は、オプション1-ロギングを使用します。
「検査が難しい」構造は、STL/Boostだけでなく、Qt/KDEなどの他のライブラリからのものであることに注意してください。