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