将 gperftools 与排序一起使用时分析计时器已过期
Profiling timer expired when using gperftools with sort
我花了一整天的时间试图让 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(排序)时得到 "Profiling timer expired"?这是使用静态版本的 gperftools 库的正确方法吗?
P.S: 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;
}
至于为什么静态链接不起作用,这是因为您的程序中没有任何内容会引入分析器符号,因此实际上变得 no-op w.r.t。分析。
我花了一整天的时间试图让 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(排序)时得到 "Profiling timer expired"?这是使用静态版本的 gperftools 库的正确方法吗?
P.S: 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;
}
至于为什么静态链接不起作用,这是因为您的程序中没有任何内容会引入分析器符号,因此实际上变得 no-op w.r.t。分析。