我的项目当前有一个静态链接的库(与gcc编译,并与ar链接),但是我目前正在尝试使用gprof来描述整个项目,在此我也想对这个静态链接的库进行描述。有什么办法可以做到这一点?

Gprof要求您将-pg提供给GCC进行编译,并将-pg提供给链接程序。但是,当-pg添加到它的标志列表时,ar会抱怨。

最佳答案

我已经很长时间没有使用gprof了,但是-pg甚至是ar的有效参数吗?如果使用-pg编译所有对象,然后不使用-pg创建归档,则性能分析有效吗?

如果无法使gprof正常工作,则gperftools包含一个CPU事件探查器,在这种情况下,我认为它应该工作得很好。您无需使用任何特殊标志来编译应用程序,也无需尝试更改静态库的链接方式。

在开始之前,您应该了解使用gperftools时要权衡的两个问题:

  • gperftools是一个采样探查器。因此,您的结果将不会是100%
    准确,但它们应该非常好。使用
    采样探查器是,它不会真正降低应用程序的速度。
  • 在多线程应用程序中,以我的经验,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。您尝试做的事情有很多重叠之处,因此也许会有所帮助。

    10-04 11:48