我需要一种方法来检测调用特定函数的位置。 E.g:
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
,但我不完全确定它只是代码中的函数调用。