首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在排序中使用gperftools时,分析计时器已过期

在排序中使用gperftools时,分析计时器已过期
EN

Stack Overflow用户
提问于 2017-02-03 20:37:10
回答 1查看 626关注 0票数 0

我花了一整天的时间尝试让gperftools正常工作:/

我尝试了不同的libunwind版本,但当我成功安装它时,每当我使用std::system时,我都会得到以下错误"Profiling“。

main.cpp:

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

我尝试执行分析,如下所示:

代码语言:javascript
复制
$ 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

然后我做到了:

代码语言:javascript
复制
$ env LD_PRELOAD="/usr/local/lib/libprofiler.so" 
$ sort file
$ env LD_PRELOAD=
$ sort file

当我将LD_PRELOAD设置为"/usr/local/lib/libprofiler.so“时,排序不起作用!!

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

代码语言:javascript
复制
$ 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库的静态版本的正确方式吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-21 04:51:11

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

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

至于为什么静态链接不起作用,这是因为你的程序中没有引入分析器符号,所以实际上变成了no-op w.r.t。分析。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42024496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档