web-dev-qa-db-ja.com

gdbを使用したC ++ STL / Boostのベストプラクティスのデバッグ

Gdbを使用したデバッグでは、STL/boostを使用するc ++コードはまだ悪夢です。 STLでgdbを使用したことがある人なら誰でもこれを知っています。たとえば、コード here の一部のデバッグセッションの実行例を参照してください。

チップを集めて痛みを軽減しようとしています。以下に収集したヒント(特に、どのヒントを使用していて、それらに推奨される変更があるか)についてコメントしてください。

  • "Stanford GDB STL utils" および "UCF GDB utils" を使用している人はいますか?データ構造をブーストするためのそのようなユーティリティはありますか?上記のユーティリティは再帰的には使用できないようです。たとえば、boost :: shared_ptrのベクターを1つのコマンド内で判読可能な方法で出力する場合などです。
  • .gdbinitファイルを書き込みます。たとえば、UCF GDB utilsの下部にリストされているC++関連の美化機能を含めます。
  • STLportなどのチェック/デバッグSTL/Boostライブラリを使用します。
  • ロギングを使用(たとえば、説明 ここ

Update:GDBには 新しいC++ブランチ があります。

46
amit

たぶん、あなたが探していたような「ヒント」ではないかもしれませんが、C++&STLからC++&boost&STLへの数年の移行後の私の経験は、lot以前よりもGDBでの時間が短くなっています。私はこれをいくつかのことに帰します:

  • スマートポインター(特に「共有ポインター」、およびパフォーマンスが必要な場合のポインターコンテナー)を強化します。最後に明示的な削除を行わなければならなかったときのことを思い出せません(削除はC++ IMHOの「goto」です)。無効でリークしているポインタを追跡する多くのGDB時間があります。
  • boostは、おそらく他のバージョンよりも劣ったバージョンを一緒にハックすることになる、実証済みのコードでいっぱいです。例:boost::bimapは、LRUキャッシングロジックの一般的なパターンに最適です。 GDB時間の別のヒープがあります。
  • 単体テストの採用。 boost::testのAUTOマクロは、テストケースをセットアップするのが絶対的である( CppUnitよりも簡単 )ことを意味します。これは、デバッガーをアタッチする必要があるものに組み込まれるずっと前に、多くのものをキャッチします。
  • これに関連して、boost::bindテストのための設計を容易にします。たとえば、アルゴリズムはより一般的で、操作するタイプに縛られない場合があります。これにより、テストシム/プロキシ/モックオブジェクトなどへのプラグインが容易になります(これと、boostのテンプレートの素晴らしさにさらされると、これまで考えたことのないことを "テンプレート化"して、同様のテストの利点を得ることができます)。
  • boost::array。 「Cアレイ」パフォーマンス、デバッグビルドでの範囲チェック。
  • boostには、学ぶ必要のあるすばらしいコードがたくさんあります
15
timday
5
Mr.Ree

私はロギングを使用するのが最も簡単でほとんどのオプションだと思います(実際にデバッグプリントを使用していますが、それはポイントではないと思います)。最大の利点は、プログラムの実行ごとに何回でもあらゆるタイプのデータを検査し、テキストエディタで検索して興味深いデータを探すことができることです。これは非常に高速であることに注意してください。欠点は明らかです。ログに記録するデータとログを記録する場所を事前に選択する必要があります。ただし、これはそれほど深刻な問題ではありません。通常、コード内のどこで問題が発生しているのかを知っているからです(そうでない場合は、時々正気チェックを追加すれば、すぐにわかります)。

チェック/デバッグライブラリは優れていますが、テストツールとしては優れており(たとえば、実行して何か問題があるかどうかを確認します)、特定の問題のデバッグは得意ではありません。ユーザーコードの欠陥を検出することはできません。

それ以外の場合は、プレーンなGDBを使用します。 "print x"が画面いっぱいにジャンクを印刷するのが怖いのかもしれませんが、それは聞こえるほど悪くはありません。ただし、デバッグ情報がある場合、std::vectorのメンバーの印刷などの作業が失敗し、何かが失敗した場合でも、xコマンドで未加工メモリを検査できます。しかし、探しているものがわかっている場合は、オプション1-ロギングを使用します。

「検査が難しい」構造は、STL/Boostだけでなく、Qt/KDEなどの他のライブラリからのものであることに注意してください。

3
jpalecek