c++ - 如何向静态库添加分析编译?

标签 c++ c linux gcc unix-ar

我的项目当前有一个静态链接的库(用 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/

相关文章:

linux - RHEL 6 中 NetworkManager 服务的用途是什么?

c++ - 将 C++ 程序的输出发送到变量 bash

c - 复制的字符串是否以 '\0' 结尾(第 1.9 节 C 编程语言 K&R2)

c - 此基数排序代码中的最后一个 `for` 循环有什么作用?

linux - 使用内核模块更改文件打开模式

linux - 这个程序集如何不崩溃?

c++ - 找不到 Visual Studio 2013 的 WRL 项目模板

c++ - 提高可读性和可维护性 : omit < > for many variable declaration possible?

c++ - 为什么我的程序在调试器中运行良好时会崩溃,但在 VS 2010 C++ 中不使用调试器运行时会崩溃?

c - line_c |= 064;/* 错误地设置了位 2,4 和 5 */.. Misra C 指南。这是怎么发生的?