【发布时间】:2013-12-05 00:15:58
【问题描述】:
我的项目目前有一个静态链接的库(使用 gcc 编译并使用 ar 链接),但我目前正在尝试使用 gprof 分析我的整个项目,我还想在其中分析这个静态链接的库。有没有办法做到这一点?
Gprof 要求您将 -pg 提供给 GCC 进行编译,并将 -pg 提供给链接器。但是,当将 -pg 添加到它的标志列表中时,ar 会抱怨。
【问题讨论】:
我的项目目前有一个静态链接的库(使用 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 绑定应用程序,并且我记录了很多我的发现 here。与您尝试做的事情有很多重叠,所以也许会有所帮助。
【讨论】: