特定の関数が呼び出される場所を検出する方法が必要です。例えば:
myPrint():
main.c, line 28
utils.c, line 89
ポイントは、定義や宣言ではなく、関数呼び出しだけが必要だということです。また、「単純な」C ライクな識別子だけでなく、クラス メソッド、名前空間で定義された関数などにも必要です。このプログラムは主に C++ で使用するためです。
私の試み
GTags - 識別子をかなりうまく検出しますが、関数呼び出しと定義などを区別する方法はありません.
CScope - C には適していますが、C++ では失敗することがあります
objdump
+addr2line
- 以下で詳しく説明します
私は今objdump
、addr2line
この方法で使用しようとしています:
objdump --disassemble-all binary | grep 'nameOfFunction'
出力は次のようになります。
5834c3: e8 e8 79 00 00 callq 58aeb0 <_ZN7espreso14IterSolverBase24Solve_RegCG_singular_domERNS_10ClusterCPUERSt6vectorIS3_IdSaIdEESaIS5_EE>
58bef4: e8 57 45 00 00 callq 590450 <_ZZN7espreso14IterSolverBase24Solve_RegCG_singular_domERNS_10ClusterCPUERSt6vectorIS3_IdSaIdEESaIS5_EEENKUliE_clEi>
58bf43: e8 08 45 00 00 callq 590450 <_ZZN7espreso14IterSolverBase24Solve_RegCG_singular_domERNS_10ClusterCPUERSt6vectorIS3_IdSaIdEESaIS5_EEENKUliE_clEi>
58bf7c: e8 cf 44 00 00 callq 590450 <_ZZN7espreso14IterSolverBase24Solve_RegCG_singular_domERNS_10ClusterCPUERSt6vectorIS3_IdSaIdEESaIS5_EEENKUliE_clEi>
次に、最初の列から番号を取得し、次のようなコードで物理的な場所を取得しようとします。
addr2line -e binary 5834c3
関数呼び出しが正しく検出される場合もあれば、まったく異なるものが検出される場合もあります (ある種の参照などだと思います)。
それで、私の質問は、どの調査結果が関数呼び出しであるかを検出することは可能ですか? 出力にあることがわかりcallq
ましたが、コード内の関数呼び出しだけであるかどうかは完全にはわかりません。