Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gperftools - profile file not dumped

I've configured and built gpreftools. however, I can't seem to find the generated profile file of my program to display it.

I took the following actions:

  1. Adding the -lprofiler linker flag to my .pro, building the program and the flag is added correctly at the linking stage. QMAKE_LFLAGS += -lprofiler

  2. Running with: $ CPUPROFILE=/tmp/prof.out /path/to/executable

  3. Executing: $ pprof --gv /path/to/MyExe /tmp/prof.out

Then I get the following:

Failed to get profile: curl -s --max-time 90 'http:///pprof/profile?seconds=30' > /home/eslam/pprof/.tmp.MyExe.1509005857.: No such file or directory.

Anyone has a resolve on this?

like image 490
Eslam Avatar asked Oct 26 '17 08:10

Eslam


2 Answers

Check that your program actually links to libprofiler.so. Some OSes (e.g. AFAIK some versions of ubuntu) do not actually add .so if none of it's symbols are actually used. E.g. ldd ./yourprogram should list libprofiler.so. If this does not happen, then you should prepend something like -Wl,--no-as-needed to your linker flags.

like image 187
Aliaksei Kandratsenka Avatar answered Oct 03 '22 06:10

Aliaksei Kandratsenka


LD_PRELOAD method without rebuild

Besides passing -Wl,--no-as-needed,-lprofiler,--as-needed at build time mentioned by Eslam, you can also get it to work without modifying the build by passing the LD_PRELOAD option at runtime as:

LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libprofiler.so CPUPROFILE=prof.out ./main.out

You can find libprofiler.so easily with locate libprofiler.so.

See also: How can I profile C++ code running on Linux?

Tested in Ubuntu 18.04.