12

所以我一直在做以下事情:

$ pprof /bin/ls ls.prof
Using local file /bin/ls.
Gathering CPU profile from http://ls.prof/pprof/profile?seconds=30 for 30 seconds to
  /home/user/csteifel/pprof/ls.1414597606.ls.prof
Be patient...

curl: (7) couldn't connect to host
Failed to get profile: curl 'http://ls.prof/pprof/profile?seconds=30' > /home/user/csteifel/pprof/.tmp.ls.1414597606.ls.prof: No such file or directory

我不确定这里发生了什么,因为这是他们在这里展示的示例之一:http: //google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html

现在我知道ls实际上并没有信息,但我也知道在这种情况下它不应该给我关于 curl 的错误,它应该是别的东西。我在这里做错了什么?

我也尝试对我创建的示例程序执行此操作(例如:pprof --callgrind /home/user/csteifel/testing2/X86_64_DEBUG/el6/wtf ~/testing2/prof.out > callgrind.out我收到类似的错误:

Using local file /home/user/csteifel/testing2/X86_64_DEBUG/el6/wtf.
Use of uninitialized value $host in substitution (s///) at /home/user/csteifel/usr/local/lib/bin/pprof line 3195.
Use of uninitialized value $hostport in concatenation (.) or string at /home/user/csteifel/usr/local/lib/bin/pprof line 3197.
Use of uninitialized value $prefix in concatenation (.) or string at /home/user/csteifel/usr/local/lib/bin/pprof line 3197.
Use of uninitialized value $host in substitution (s///) at /home/user/csteifel/usr/local/lib/bin/pprof line 3195.
Use of uninitialized value $hostport in concatenation (.) or string at /home/user/csteifel/usr/local/lib/bin/pprof line 3197.
Use of uninitialized value $prefix in concatenation (.) or string at /home/user/csteifel/usr/local/lib/bin/pprof line 3197.
Use of uninitialized value $host in sprintf at /home/user/csteifel/usr/local/lib/bin/pprof line 3364.
Gathering CPU profile from http:///pprof/profile?seconds=30 for 30 seconds to
  /home/user/csteifel/pprof/wtf.1414597016.
Be patient...

curl: (6) Couldn't resolve host 'http:'
Failed to get profile: curl 'http:///pprof/profile?seconds=30' > /home/user/csteifel/pprof/.tmp.wtf.1414597016.: No such file or directory
4

1 回答 1

10

快速回答(以及解决我的问题):如果您选择使用环境变量运行分析器的方法 1,gcc默认情况下会忽略您的链接,因为您没有使用该库中的任何符号。您需要将其与-Wl,--no-as-needed标志一起包含,如下所示:

-Wl,--no-as-needed -lprofiler -Wl,--as-needed

你可以在这里阅读更多关于它的信息。


一个更彻底的答案,提示其他潜在问题:

pprof查找名为 的本地文件ls.prof,其中包含有关 的各种组件的运行时的信息/bin/ls(这就是您使用-g标志编译有问题的程序的原因,以便它可以看到符号)。

现在,为什么文件不存在?因为它还没有生成!您/bin/ls尚未使用-lprofiler标志编译。如果是这样,并且您通过文档中列出的两种方式之一激活了库:

  1. 将环境变量 CPUPROFILE 定义为要将配置文件转储到的文件名。例如,分析 /usr/local/bin/my_binary_compiled_with_libprofiler_so

    % env CPUPROFILE=/tmp/mybin.prof /usr/local/bin/my_binary_compiled_with_libprofiler_so
    
  2. 在您的代码中,将要在 ProfilerStart() 和 ProfilerStop() 调用中分析的代码括起来。(这些函数在 . 中声明。) ProfilerStart() 将 profile-filename 作为参数。

如果你做了其中任何一个,ls使用库编译,每次运行它时,你都会看到类似

% ls -la ~
% <output>
% PROFILE: interrupts/evictions/bytes = 204/0/256

这意味着配置文件已经生成,您现在可以查看它

% pprof binary_compiled_with_lprofiler profile_file
于 2014-11-11T04:14:17.847 回答