# Debugging applications¶

## Compile the package you need¶

Avoid running catkin build without specifying a package since this builds the entire workspace which takes a long time. You can specify individual packages simply by adding their names:

catkin build maplab


## Build single packages efficiently¶

If you only changed a single package you can also restrict the build process to this single package:

catkin build maplab --no-deps


Even more efficient is invoking make -j8 in the build folder of the package

cd ~/maplab_ws/build/maplab && make -j8


## Compile in Release mode¶

Most packages are not built in Release mode. To build packages in Release mode:

catkin build maplab --cmake-args -DCMAKE_BUILD_TYPE=Release


To set this as the default behavior in your current catkin profile:

catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release


## Change individual packages to Debug mode¶

If you want to debug a program it makes sense to switch the package that the error is contained in to Debug mode.

cd ~/catkin_ws/build/maplab
ccmake .


If ccmake is not installed on your system, you have to install it using:

sudo apt-get install cmake-curses-gui


If ccmake is there, you will now see a window similar to this:

 BUILD_SHARED_LIBS                ON
CATKIN_DEVEL_PREFIX              /Users/slynen/catkin_ws/devel
CATKIN_ENABLE_TESTING            ON
CATKIN_PACKAGE_PREFIX
CATKIN_SKIP_TESTING              OFF
CMAKE_BUILD_TYPE                 Release
CMAKE_INSTALL_PREFIX             /Users/slynen/catkin_ws/install
...


Navigate to the line which says CMAKE_BUILD_TYPE using the cursor keys and press Enter. Now replace Debug with Release. Press c to configure, followed by g to generate. (you might now press e to hide warnings.). Finally press q to quit. Now make the package by invoking:

cd ~/maplab_ws/build/maplab && make -j8


HINT: Don’t forget to switch back to Release once you are done with debugging.

## Run gdb with arguments¶

In order to run a process with arguments in gdb, the most efficient way is to use:

gdb --ex run --args ~/devel/lib/maplab/maplab --use_external_memory=false


Where --use_external_memory=false is just an example flag.