31

I have looked at dozens of tutorials for profiling with gprof. I'm trying to work with code for the SMT solver dReal. To build the program, I first installed g++-4.8, Bison, Flex, and Cmake. Then to build dReal, the instructions said to execute the following:

git clone git@github.com:soonhokong/dReal.git dreal  
cd dreal  
mkdir -p build/release  
cd build/release  
cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 ../../src  
make

Where in here am I supposed to add the -pg? I'm new to programming, so reasoning as opposed to an answer would be much appreciated. I know you're supposed to add the -pg to the compilation stage but all the tutorials say to put it after g++ or gcc. I can't find how to modify the code for cmake. I did try changing the build type to PROFILE but that didn't help.

RAM
  • 2,257
  • 2
  • 19
  • 41
Phdetermined
  • 411
  • 1
  • 4
  • 5

2 Answers2

31

In order to use gprof, you need to both compile and link with the -pg option.

CMakeLists.txt should have a setup like Ami Tavory mentioned, where command line options are combined with hardcoded options, so a good way to do this with a well built cmake project is:

cmake -DCMAKE_CXX_FLAGS=-pg -DCMAKE_EXE_LINKER_FLAGS=-pg -DCMAKE_SHARED_LINKER_FLAGS=-pg <SOURCE_DIR>
zzmp
  • 421
  • 4
  • 9
12

I'm Soonho Kong, one of the maintainers of dReal. It would be easier for us to answer questions regarding dReal, if you put the "dreal" tag on the question.

  1. In general, you can pass compiler flags such as -pg to cmake by running:

    cmake -DCMAKE_CXX_FLAGS=-pg

  2. For the profiling, I normally use valgrind + callgrind.

  3. To measure the code coverage, we are using gcov and lcov tools. You may want to take a look at how we set up the compiler flags for that, which can help you set up your own compiler flags for gprof.

Soonho Kong
  • 365
  • 1
  • 9
  • 1
    This works really well by me too. For future reference, in `CMakeLists.txt`, I have `set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} blah blah blah")`, which combines hardcoded stuff with the stuff provided from the cmd line. – Ami Tavory Jul 27 '15 at 18:01
  • 1
    Does passing it like this overwrite other flags set in `CMakeLists.txt` (or included .cmake files), or is it prepended / appended to the project's MAKE_CXX_FLAGS ? Will this be passed to the linker (I guess the program needs to be linked with `-pg` as well)? – Tomasz Gandor Apr 06 '16 at 12:37
  • It work for me but I added -DCMAKE_C_FLAGS=-pg -DCMAKE_CXX_FLAGS=-pg -DCMAKE_BUILD_TYPE=Debug Then I run application alone after than i use gprof to log profiling. > cmake -DCMAKE_C_FLAGS=-pg -DCMAKE_CXX_FLAGS=-pg -DCMAKE_BUILD_TYPE=Debug .. > make > ./application > gprof ./application gmon.out > profile.txt > gprof ./application -l gmon.out > profile_line.txt – wow2006 Jan 08 '17 at 13:16
  • 1
    `gprof` and `valgrind+callgrind` do different things and give you different answers. – iAdjunct Mar 21 '18 at 14:09