実行パスをトレースするために C コードのコール グラフを生成するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-14 21:30:02
オリジナル
192 人が閲覧しました

How Can I Generate Call Graphs for C   Code to Trace Execution Paths?

実行パスをトレースするための C コードのコール グラフの生成

C プログラミングでは、特定の関数に至る可能性のあるすべての実行パスを識別することができます。特に複雑なコードベースを扱う場合は、時間のかかる手動タスクです。ここでコール グラフが登場し、関数呼び出し関係をグラフィカルに表現します。

CodeViz と Doxygen の制限

CodeViz や Doxygen などのツールはコール グラフを生成できますが、多くの場合、ターゲット関数の呼び出し先のみを表示することに重点が置かれます。これは、呼び出し階層全体をトレースバックする必要がある状況では不十分である可能性があります。

LLVM と Graphviz を使用した効果的な方法

堅牢なアプローチには、LLVM コンパイラーの活用が含まれます。コール グラフ生成のためのインフラストラクチャと Graphviz:

  1. 次を使用してコードを LLVM ビットコードにコンパイルします。 Clang -S -emit-llvm.
  2. opt -analyze を使用してビットコードを分析し、呼び出し関係を特定します。
  3. -dot-callgraph を使用してコール グラフの DOT 表現を生成します。
  4. ドットを使用してグラフを視覚化します-Tpng.

例を示します:

$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph
$ dot -Tpng -ocallgraph.png callgraph.dot
ログイン後にコピー

これにより、ターゲット関数に至る実行パスを示すコール グラフ PNG イメージ (callgraph.png) が作成されます。

外部連携の扱い

外部連携main は外部から呼び出されることが想定されているため、複雑さが生じる可能性があります。これに対処するには:

  1. 外部関数を考慮するにはアナライザーで -std-link-opts を使用します。
  2. 関数名とクラス名のマングルを解除するには c filt を使用します。
  3. DOT 表現から外部ノードをフィルタリングします。

これらの手順を組み込むことで、 C コードの実行パスを効果的にトレースする包括的なコール グラフを生成し、コードの理解とデバッグを簡素化できます。

以上が実行パスをトレースするために C コードのコール グラフを生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート