pyrrhic
pyrrhic

Reputation: 1897

Debugging C++ Library

I've been working on adding functionality to a C++ library. The library is compiled by using CMake. It has a complex set of dependencies. I have a C++ test file that runs code relating to the library. Let the compiled file be test.cpp, its executable test.

So far, I've been debugging by adding "cout" statements to the library files. I frequently get segmentation faults, but can usually figure it out by inspection. Obviously, this is inefficient. I want to see where the code fails, by using gdb. Via this stackoverflow post, I tried adding debug flags to my cmake, but when I run gdb on test and do bt, I don't get comprehensive info. I simply get the name of the function in the library where the code fails, not the exact line.

Anyone know how to get the gdb information?

Upvotes: 1

Views: 2772

Answers (2)

ComicSansMS
ComicSansMS

Reputation: 54589

While adding the respective compiler flags manually will work, it is not the most convenient way of doing so. As suggested by @ruslo, you should use the following command line instead for getting debug support:

cmake -DCMAKE_BUILD_TYPE=Debug <path_to_source>

There are several reasons for this:

  • Compiler flags are not portable. -g -O0 will work on gcc, but what about other compilers? One of CMake's main strengths is to make portability easy, so you should not throw it out of the window easily.
  • Multi-configuration generators (like most IDE generators) allow to use multiple profiles at once. You would not want to force users of those IDEs to compile without optimizations even though they selected a Release profile, would you?
  • Changes to CMAKE_CXX_FLAGS are global. This becomes especially nasty once you have to compose multiple projects together. If you absolutely need to manually give compiler flags, use target_compile_options for this purpose.
  • Last but not least: Setting CMAKE_BUILD_TYPE is the idiomatic solution to this problem. It is the one right tool for solving it and people familiar with CMake (granted, there are not too many around of those...) will be surprised if you solve it using a non-idiomatic workaround.

Upvotes: 2

pyrrhic
pyrrhic

Reputation: 1897

I've figured it out. They key is to add the "-g" flag to

SET (CMAKE_C_FLAGS ...

and

SET(CMAKE_CXX_FLAGS ...

to the CMakeLists.txt file.

Upvotes: 0

Related Questions