2

特定の関数が呼び出される場所を検出する方法が必要です。例えば:

myPrint():
main.c, line 28
utils.c, line 89

ポイントは、定義や宣言ではなく、関数呼び出しだけが必要だということです。また、「単純な」C ライクな識別子だけでなく、クラス メソッド、名前空間で定義された関数などにも必要です。このプログラムは主に C++ で使用するためです。


私の試み

  1. GTags - 識別子をかなりうまく検出しますが、関数呼び出しと定義などを区別する方法はありません.

  2. CScope - C には適していますが、C++ では失敗することがあります

  3. objdump+ addr2line- 以下で詳しく説明します

私は今objdumpaddr2lineこの方法で使用しようとしています:

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ましたが、コード内の関数呼び出しだけであるかどうかは完全にはわかりません。

4

0 に答える 0