我的项目当前有一个静态链接的库(与gcc编译,并与ar链接),但是我目前正在尝试使用gprof来描述整个项目,在此我也想对这个静态链接的库进行描述。有什么办法可以做到这一点?
Gprof要求您将-pg提供给GCC进行编译,并将-pg提供给链接程序。但是,当-pg添加到它的标志列表时,ar会抱怨。
最佳答案
我已经很长时间没有使用gprof了,但是-pg甚至是ar
的有效参数吗?如果使用-pg编译所有对象,然后不使用-pg创建归档,则性能分析有效吗?
如果无法使gprof正常工作,则gperftools包含一个CPU事件探查器,在这种情况下,我认为它应该工作得很好。您无需使用任何特殊标志来编译应用程序,也无需尝试更改静态库的链接方式。
在开始之前,您应该了解使用gperftools时要权衡的两个问题:
准确,但它们应该非常好。使用
采样探查器是,它不会真正降低应用程序的速度。
剖析主线程。我成功的唯一途径
配置文件工作程序线程是通过向我的应用程序添加分析代码。
话虽如此,分析主线程应该不需要任何代码
变化。
使用gperftools的方式有很多。我的首选方法是使用
$LD_PRELOAD
加载gperftools库,使用$CPUPROFILE
指定记录目标,并可能在启动应用程序之前使用$CPUPROFILE_FREQUENCY
提高采样频率。像这样: export LD_PRELOAD=/usr/lib/libprofiler.so
export CPUPROFILE=/tmp/prof.out
export CPUPROFILE_FREQUENCY=10000
./my_application
这会将大量分析信息写入/tmp/prof.out。您可以运行后处理脚本,以将该文件转换为人类可读的文件。 supported output formats很多-我首选的是callgrind:
google-pprof --callgrind /path/to/my_application /tmp/prof.out > callgrind.dat
kcachegrind callgrind.dat &
这样可以很好地了解程序在哪里花费时间。
如果您有兴趣,我在周末花费了一些时间来学习如何使用gperftools来分析受I/O绑定(bind)的应用程序,并且记录了很多发现here。您尝试做的事情有很多重叠之处,因此也许会有所帮助。