使用带有排序的gperftools时,性能分析计时器已过期

时间:2017-02-03 12:37:10

标签: c++ linux gperftools

我花了一整天努力让gperftools工作:/

我厌倦了不同的libunwind版本但是当我成功安装它时,每当我使用std :: system时,我都会收到以下错误“Profiling timer expired”。

main.cpp中:

#include <cstdlib>
int main(int argc, char** argv) {
    std::system("cut -f1 anyExistingFile | sort > newSortedFile");
    return 0;
}

我厌倦了如下进行分析:

$ g++ main.cpp -o myApp -std=c++11
$ env CPUPROFILE=out.prof    LD_PRELOAD="/usr/local/lib/libprofiler.so" ./myApp
Profiling timer expired
PROFILE: interrupts/evictions/bytes = 0/0/64
然后我做了:

$ env LD_PRELOAD="/usr/local/lib/libprofiler.so" 
$ sort file
$ env LD_PRELOAD=
$ sort file
当我将LD_PRELOAD设置为“/usr/local/lib/libprofiler.so”时,

排序无效!

然后我尝试使用该库的静态版本:

$ g++ main.cpp -o myApp -std=c++11 /usr/local/lib/libtcmalloc_and_profiler.a
$ env CPUPROFILE=out.prof ./myApp

什么都没发生,out.prof没有创建!

所以我想知道为什么当我使用std :: system(sort)时我得到“Profiling timer expired”?并且它是使用静态版本的gperftools库的正确方法吗?

P.S:64位,gperftools = 2.5,libunwind = 1.1,linux Ubuntu 16.04.1

1 个答案:

答案 0 :(得分:1)

问题似乎是当你设置LD_PRELOAD时,实际上是为当前shell工作中的所有内容设置它,包括程序产生的子进程。 CPUPROFILE环境变量也是如此。因此,cpu profiler也会被激活以进行排序。并且它看起来像sort程序中的某些东西正在将SIGPROF信号处理程序重置为默认值而不实际重置相应的间隔计时器。因此,当sort完成足够的工作时,它会获得信号并且默认处理程序退出程序。简单的解决方法是在排序程序周围取消CPUPROFILE。 E.g:

#include <cstdlib>
int main(int argc, char** argv) {
    std::system("cut -f1 /usr/share/dict/american-english-insane | CPUPROFILE='' sort  > /tmp/insane");
    return 0;
}

至于为什么静态链接不起作用,这是因为程序中的任何内容都没有拉入探查器符号,因此实际上变为无操作w.r.t.分析