使用排序方式使用gperftools时,分析计时器已过期

我花了整整一天的时间试图让Gperftools发挥作用:/

我厌倦了不同的libunwind版本,但是当我成功安装它时,每当我使用std :: system时,都会收到以下错误“性能分析计时器已过期”。

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)时会出现“性能分析计时器过期”? 并且它是使用静态版本的gperftools库的正确方法?

PS:64位,gperftools = 2.5,libunwind = 1.1,linux Ubuntu 16.04.1


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

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

至于为什么静态链接不起作用,那是因为你的程序中没有任何东西会引用profiler符号,所以实际上无法进行分析。

链接地址: http://www.djcxy.com/p/87957.html

上一篇: Profiling timer expired when using gperftools with sort

下一篇: How does gperftools work under the hood?