No function names when using gperftools/pprof

1.7k Views Asked by At

I've been trying to get gperftools CPU profiling working on my program.

I'm running into an issue where all the function names in my program are pointer addresses when reported by pprof. Annoyingly, most of the function names from libraries I've linked are readable, but none from my program files are. Example below.

s979258ca% pprof --text ./hmiss hmiss.prof                                        
Using local file ./hmiss.
Using local file hmiss.prof.
Total: 469 samples
     152  32.4%  32.4%      152  32.4% 0x000000010ba6dd45
      47  10.0%  42.4%       47  10.0% 0x000000010ba6d365
      46   9.8%  52.2%       46   9.8% 0x000000010ba6d371
      34   7.2%  59.5%       34   7.2% 0x000000010ba8a04a
      32   6.8%  66.3%       32   6.8% 0x000000010ba6d35a
      10   2.1%  68.4%       10   2.1% 0x000000010ba8873c
       9   1.9%  70.4%        9   1.9% 0x00007fff63f409da
       6   1.3%  71.6%        6   1.3% 0x000000010ba7feca
       6   1.3%  72.9%        6   1.3% 0x00007fff63f40116
       6   1.3%  74.2%        6   1.3% 0x00007fff63f409f2
       5   1.1%  75.3%        5   1.1% 0x000000010ba6dd4c
       ...

What do I need to do to get my functions names included in the pprof output?

Here's what the process to get to the above point looks like for me, if it helps. I build my program with the options below

clang++
"-std=c++17",
"-g",
"-O2",
"...cpp files..."
"-o",
"~/cpp/hmiss/hmiss",
"/usr/local/Cellar/gperftools/2.7/lib/libprofiler.dylib",

I enable CPU profiling with gprof by running

DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib CPUPROFILE=hmiss.prof ./hmiss

I then run pprof --text ./hmiss hmiss.prof

From an answer to a similar question I thought possibly including debugging symbols might get the names in there, but just building my program with -g didn't seem to help. Also, removing the -O2 flag did not help either.

2

There are 2 best solutions below

0
On

I had a similar issue that pprof was only showing the binaries, not the function name and line. Also it was taking ages to produce the traces.

I found you can't call it as go tool pprof instead you must call ~/go/bin/pprof or have it on your path directly.

1
On

Use google's pprof instead of brew's pprof https://github.com/google/pprof