我的项目当前有一个静态链接的库(用 gcc 编译并与 ar 链接),但我目前正在尝试使用 gprof 分析我的整个项目,其中我还想分析这个静态链接库。有什么办法可以做到这一点吗?
Gprof 要求您向 GCC 提供 -pg 以进行编译,并向链接器提供 -pg。然而,当 -pg 添加到它的标志列表中时,ar 会提示。
最佳答案
我已经很长时间没有使用 gprof 了,但是 -pg 是 ar
的有效参数吗?如果使用 -pg 编译所有对象,然后在不使用 -pg 的情况下创建存档,分析是否有效?
如果您无法让 gprof 工作,gperftools包含一个 CPU 分析器,我认为在这种情况下应该工作得很好。您不需要使用任何特殊标志来编译应用程序,也不需要尝试更改静态库的链接方式。
在开始之前,您应该了解使用 gperftools 时需要注意的两个权衡:
- gperftools 是一个采样分析器。因此,您的结果不会是 100% 准确,但它们应该非常好。使用的最大好处是 采样分析器的优点是它不会真正减慢您的应用程序的速度。
- 在多线程应用程序中,根据我的经验,gperftools 只会 配置文件主线程。我能够成功的唯一方法 分析工作线程是通过向我的应用程序添加分析代码来进行的。 话虽如此,分析主线程不需要任何代码 变化。
使用 gperftools 的方法有很多。我的首选方法是使用 $LD_PRELOAD
加载 gperftools 库,使用 $CPUPROFILE
指定日志记录目标,并可能使用 $CPUPROFILE_FREQUENCY
提高采样频率code> 在启动我的应用程序之前。像这样的事情:
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 。与您想要做的事情有很多重叠,所以也许会有帮助。
关于c++ - 如何向静态库添加分析编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388916/