C/C++ コードを理解する作業を容易にするツールの提案はありますか? 他の人が作成した大きなソフトウェアを継承したばかりで、すぐにそれについて理解する必要があります。このタスクを簡素化するツールに関するアドバイスはありますか?
16 に答える
SourceInsightとC++ の理解は、フロー チャートを含む c/c++ コード分析に使用できる最良のツールです。
プロファイリング ソフトウェアを使用すると、どの関数が呼び出されたかがわかります。
Linux を使用できる場合は、KCachegrindを試してください
Doxygenは、EXTRACT_ALL オプションをオンにすると、マークアップを適用せずにコードから図を生成するのに非常に優れています。HAVE_DOT 設定で生成された図を取得するには、GraphVizをインストールする必要があります。インストールして DOT_PATH を空白のままにしておくと、Windows では問題なく動作しますが、OS/X では、ドット ツールの場所を直接指定する必要があります。
ACM Queue には、doxygen と DTrace の使用について詳しく説明している優れたCode Spelunking記事があります。
個人的には、デバッガーを使用します。コードを実行して、何をしているのか、どこに行くのが唯一の方法なのかを確認してください。
ただし、(場合によっては)役立ついくつかのドキュメントジェネレーターを介して実行できます。良い例はdoxygenです。
Linux(KDE)を使用している場合は、cscopeユーティリティに基づいて構築されたKScope。私がこれまでに使用した(そして常に使用している)最高のものは、なんらかの方法で変更する必要がある、または自分のニーズに合わせて使用するAPIを、見慣れないコードの巨大な部分を掘り下げるために使用しました。その機能の中には、さまざまな方法で検索できる相互参照データベースがあります。シンボルのすべての参照、そのグローバル定義、関数の呼び出し元/呼び出し先の検索などがあります。IDEが組み込まれており、コールグラフを表示する機能もあります。
Doxygenは、特に準備していなくても、graphviz を使用するとクラス関係図を提供します。
Egypt http://www.gson.org/egypt/egypt.htmlのように機能するツールがいくつかありますが、コードのコンパイルに使用される予想される GCC バージョンとコールグラフ ジェネレーターの正確なバージョンが一致する場合に限ります。codeviz http://www.csn.ul.ie/~mel/projects/codeviz/についても同じことが言えます。
その他のオプションは、cachegrind モードで使用される valgrind です (これは、kcachegrind プログラムから追跡できるタイプのコールグラフを生成します。
しばらく前にBorland Togetherを使用しましたが、コードからモデルを生成するのに適切な仕事をしてくれました。コードからシーケンス図を生成することさえできると思います。コードが混乱している場合、モデルも混乱することに注意してください。そして、私が覚えているように、それは安くはありませんが、時には特別なものを捕まえることができます.
私は個人的に Visual Studio デバッガー ツールを使用しています。
小さなボックスで内容を視覚化できる「Caller Graph」機能が付属しています。また、コール スタックと通常の監視機能だけで、通常は必要なすべての機能を利用できます。
Eclipse 3.4.0 ではうまく動作しないAspectBrowserもあります。
AQtimeを試してみてください。呼び出されたすべての関数 (およびかかった時間) を表示するプロファイリング ツールです。分析の開始点と終了点を設定できます。30日間のトライアルがあります。
Visustin という名前のツールを試してみましたが、これはグラフィカルにはあまり優れていませんが、「コードからのフローチャート」ということを実行します。 http://www.aivosto.com/visustin.html
Rational Quantify は、優れた呼び出しグラフも提供します。
doxygenは無料のドキュメント生成ツール (Javadoc に似ています) で、関係グラフも生成します。
Doxygen、それについての良いことは、クラスの循環依存性の観点から、コードが醜い/良いことを知らせることです。したがって、気に入らないかもしれませんが、コードをリファクタリングする必要があります:-)
Slickedit は、知らない大きなコード ブロックをナビゲートするのに最適です。タグ機能を使用すると、どのファイルに含まれているかを気にせずに、コードを機能ベースで処理できます。
理解できないメソッド、クラス、または変数にたどり着いたときは、タグをプッシュしてそのコードに移動し、それを調べてから、タグをポップして戻します。(これらはキーストロークにバインドされているため、非常に高速です)
find-references を使用して、その関数/変数が使用されている場所を確認することもできます。
どのファイルに何かが入っているかを調べに行く必要があるため、時間を大幅に節約できます。