Обнаружение определенных вызовов функций в исходных кодах с помощью objdump
Мне нужен способ обнаружить места, где вызывается определенная функция. Например:
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
в выводе, но я не совсем уверен, что это только вызов функции в коде.