使用objdump检测源代码中的特定函数调用

时间:2016-09-02 08:49:15

标签: c++ parsing call objdump addr2line

我需要一种方法来检测调用特定函数的位置。 E.g:

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

关键是,我只需要函数调用,不是定义或声明。而且我不仅需要“简单”的C类标识符,而且还需要类名方法,命名空间等定义的函数,因为我将主要用于C ++。

我的尝试

  1. GTags - 很好地检测标识符,但没有办法区分函数调用与定义等。

  2. CScope - 适用于C,但有时使用C ++失败

  3. objdump + addr2line - 详细说明如下

  4. 我现在正尝试以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,但我不完全确定它只是代码中的函数调用。

0 个答案:

没有答案