如何在linux下查看动态链接库如*.so中各函数的CPU占用情况?

时间:2022-03-28 15:51:56
gprof是linux下查看函数调用的一个不错的工具,但它有几个致命的缺点:
1、不支持多线程;
2、只能看到主程序的函数调用,动态加载库的函数调用无法捕捉。

我有一个程序,动态加载了若干个库,目前使用gprof可以看到主程序的函数调用情况,但无法获取各动态库中各函数调用的情况。

各位兄弟有什么好的办法吗?

23 个解决方案

#1


不至于这个问题难道所有混csdn的哥们吧,汗!

#2


兄弟,对于二进制的代码,除了汇编命令外,你不能看到原代码,没有原代码,你就看在一个个.so里面的函数名之间跳转,我觉得意义不是很大阿。

#3


我有源代码,我是想通过某个工具测试一些各个函数的CPU占用情况,当从眼睛来看代码已经不能够满足优化代码的需求了,不知道我说的是否明白。

#4


顶!
我目前还不知道有什么工具
一般都是在分析后,对一些可能是性能瓶颈的函数调用前后gettimeofday,统计时间

期待哪位有什么好办法

#5


gettimeofday这种方法让人沮丧,期待更好的办法吧。

#6


linux不太熟,可以用采样的方法看占用情况。

#7


期待兄弟们给出更好的解决办法,目前用gettimeofday方法搞得我想死的心都有

#8


期待兄弟们给出更好的解决办法,目前用gettimeofday方法搞得我想死的心都有

#9


解决不动,
接分

#10


回去研究gprof一下先,我

#11


对在函数调用内部加入时间这种方法,我相信是最直接最有效的方式,但同时也是最浪费时间的方法,我现在正在这么做,不过试想在接近300个函数内部加入计时代码,是件多么让人沮丧的事情,更痛苦的是,这些代码里还有无数的return。
不过目前看来,似乎没有别的路可走了。

#12


你最后还是先分析一下
把你觉得有瓶颈的地方用gettimeofday
一个模块一个模块的解决
不要一开始就把所有函数都加上,信息太多,可能你都要晕了。

#13


没试试把库表态加载进去,然后再监控

#14


兄弟,你就不能封装一个专门测试时间的函数吗?或者是C++的类也可以阿

一个一个插入代码搞到什么时候?

#15


mark

#16


顶顶

#17


静态编译,不要动态编译

#18


努力顶起来。

#19


why not up

#20


用top或ps aux

#21


我的办法是,先用静态库的方法改写、编译这个工程,然后进行跟踪,分析出各个函数的效率,进行修改,得到满意的结果以后,在用动态库的方法来封装这个工程,这样最终的目标和原来测试也就差不多了:)

#22


学习

#23


顶。

#1


不至于这个问题难道所有混csdn的哥们吧,汗!

#2


兄弟,对于二进制的代码,除了汇编命令外,你不能看到原代码,没有原代码,你就看在一个个.so里面的函数名之间跳转,我觉得意义不是很大阿。

#3


我有源代码,我是想通过某个工具测试一些各个函数的CPU占用情况,当从眼睛来看代码已经不能够满足优化代码的需求了,不知道我说的是否明白。

#4


顶!
我目前还不知道有什么工具
一般都是在分析后,对一些可能是性能瓶颈的函数调用前后gettimeofday,统计时间

期待哪位有什么好办法

#5


gettimeofday这种方法让人沮丧,期待更好的办法吧。

#6


linux不太熟,可以用采样的方法看占用情况。

#7


期待兄弟们给出更好的解决办法,目前用gettimeofday方法搞得我想死的心都有

#8


期待兄弟们给出更好的解决办法,目前用gettimeofday方法搞得我想死的心都有

#9


解决不动,
接分

#10


回去研究gprof一下先,我

#11


对在函数调用内部加入时间这种方法,我相信是最直接最有效的方式,但同时也是最浪费时间的方法,我现在正在这么做,不过试想在接近300个函数内部加入计时代码,是件多么让人沮丧的事情,更痛苦的是,这些代码里还有无数的return。
不过目前看来,似乎没有别的路可走了。

#12


你最后还是先分析一下
把你觉得有瓶颈的地方用gettimeofday
一个模块一个模块的解决
不要一开始就把所有函数都加上,信息太多,可能你都要晕了。

#13


没试试把库表态加载进去,然后再监控

#14


兄弟,你就不能封装一个专门测试时间的函数吗?或者是C++的类也可以阿

一个一个插入代码搞到什么时候?

#15


mark

#16


顶顶

#17


静态编译,不要动态编译

#18


努力顶起来。

#19


why not up

#20


用top或ps aux

#21


我的办法是,先用静态库的方法改写、编译这个工程,然后进行跟踪,分析出各个函数的效率,进行修改,得到满意的结果以后,在用动态库的方法来封装这个工程,这样最终的目标和原来测试也就差不多了:)

#22


学习

#23


顶。