5
votes

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?

2

2 Answers

7
votes

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.

1
votes

LD_PRELOAD method

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.