C++ 使用objdump检测源代码中的特定函数调用
我需要一种方法来检测调用特定函数的位置。 例如: 关键是,我只需要函数调用,而不需要定义或声明。而且我不仅需要“简单”的C类标识符,而且需要对类方法、命名空间中定义的函数等,因为我将主要使用C++程序。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
我的尝试
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