gprof : How to generate call graph for functions in shared library that is linked to main program

atv picture atv · Dec 3, 2009 · Viewed 27.3k times · Source

I am working on Linux environment. I have two 'C' source packages train and test_train.

  1. train package when compiled generates libtrain.so
  2. test_train links to libtrain.so and generates executable train-test

Now I want to generate a call graph using gprof which shows calling sequence of functions in main program as well as those inside libtrain.so

I am compiling and linking both packages with -pg option and debugging level is o0. After I do ./train-test , gmon.out is generated. Then I do:

$ gprof -q ./train-test gmon.out

Here, output shows call graph of functions in train-test but not in libtrain.so

What could be the problem ?

Answer

Dan picture Dan · Feb 10, 2011

gprof won't work, you need to use sprof instead. I found these links helpful:

Summary from the 2nd link:

  1. Compile your shared library (libmylib.so) in debug (-g) mode. No -pg.
  2. export LD_PROFILE_OUTPUT=`pwd`
  3. export LD_PROFILE=libmylib.so
  4. rm -f $LD_PROFILE.profile
  5. execute your program that loads libmylib.so
  6. sprof PATH-TO-LIB/$LD_PROFILE $LD_PROFILE.profile -p >log
  7. See the log.

I found that in step 2, it needs to be an existing directory -- otherwise you get a helpful warning. And in step 3, you might need to specify the library as libmylib.so.X (maybe even .X.Y, not sure) -- otherwise you get no warning whatsoever.