Обнаружение определенных вызовов функций в исходных кодах с помощью objdump

Мне нужен способ обнаружить места, где вызывается определенная функция. Например:

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

Дело в том, что мне нужны только вызовы функций, а не определения или объявления. И он мне нужен не только для "простых" C-подобных идентификаторов, но даже для методов классов, функций, определенных в пространствах имен и т. Д., Потому что я буду использовать эту программу в основном для C++.


Мои попытки

  1. GTags - обнаруживает идентификаторы довольно хорошо, но нет никакого способа отличить вызовы функций от определений и т. Д.

  2. CScope - хорошо для C, но иногда не работает с C++

  3. 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 в выводе, но я не совсем уверен, что это только вызов функции в коде.

0 ответов

Другие вопросы по тегам