Вы можете использовать systemtap , чтобы получить счетчик вызовов функций.Это мощный инструмент, который позволяет вам обрабатывать во время выполнения любое приложение без необходимости его перекомпиляции, требуются только символы отладки.
Вот скрипт, который подсчитывает количество вызовов функции вместе с ее выполнениемвремя в наносекундах:
# call-counts.stp
global calls, times
probe process(@1).function(@2) {
times[probefunc()] = gettimeofday_ns()
}
probe process(@1).function(@2).return {
now = gettimeofday_ns()
delta = now - times[probefunc()]
calls[probefunc()] <<< delta
}
Вот как его использовать для подсчета вызовов getenv()
в /lib64/libc-2.12.2.so при запуске ls -1
:
$ sudo stap -c "ls -1" ~/tmp/count-calls.stp /lib64/libc-2.12.2.so getenv
binned_market_data
count-calls.stp
count-calls.stp~
Makefile
md
nohup.out
calls["getenv"] @count=23 @min=4841 @max=19257 @sum=142529 @avg=6196
Другой пример просмотра вызовов функций "str *":
$ sudo stap -c "ls -1" ~/tmp/count-calls.stp /lib64/libc-2.12.2.so "str*"
binned_market_data
count-calls.stp
count-calls.stp~
Makefile
md
nohup.out
calls["__strdup"] @count=14 @min=5035 @max=10664 @sum=80479 @avg=5748
calls["strcoll"] @count=11 @min=11626 @max=20018 @sum=140851 @avg=12804
calls["__strcoll_l"] @count=11 @min=4992 @max=9393 @sum=63179 @avg=5743
calls["strstr_ifunc"] @count=2 @min=4902 @max=7429 @sum=12331 @avg=6165