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

C++ 使用objdump检测源代码中的特定函数调用,c++,parsing,call,objdump,addr2line,C++,Parsing,Call,Objdump,Addr2line,我需要一种方法来检测调用特定函数的位置。 例如: 关键是,我只需要函数调用,而不需要定义或声明。而且我不仅需要“简单”的C类标识符,而且需要对类方法、命名空间中定义的函数等,因为我将主要使用C++程序。 我的尝试 -很好地检测标识符,但无法区分函数调用和定义等 -适用于C,但有时使用C会失败++ objdump+addr2line-下面详细描述 我现在正试图通过以下方式使用objdump和addr2line: objdump --disassemble-all binary | grep

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

关键是,我只需要函数调用,而不需要定义或声明。而且我不仅需要“简单”的C类标识符,而且需要对类方法、命名空间中定义的函数等,因为我将主要使用C++程序。
我的尝试
  • -很好地检测标识符,但无法区分函数调用和定义等

  • -适用于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
    ,但我不完全确定这是代码中唯一的函数调用。

    你试过了吗?@Leon我没有,但现在,当我看它时,它似乎只查找“引用”,这意味着定义和调用,而不仅仅是调用。您知道如何只查找调用吗?它似乎对引用进行了注释,以便您可以区分定义和调用。@Leon正如我们在中所看到的,
    void display()
    列在引用中。是的,但右侧的注释提示它是一个定义(但格式不好)。您尝试过吗?@Leon我没有,但现在,当我看它时,它似乎只查找“引用”,这意味着定义和调用,而不仅仅是调用。您知道如何仅查找调用吗?它似乎对引用进行了注释,以便您可以区分定义和调用。@Leon,如我们在中所见,
    void display()
    列在引用中。是的,但右侧的注释提示它是一个定义(但格式不好)。
    addr2line -e binary 5834c3