Wednesday, 17 August 2022

how to use docker and gdb to check the memory leak in c++ program?

ref: https://medium.com/cubemail88/c-dev-and-debug-with-docker-containers-c89b851a4b69

C++ dev and debug with Docker containers

Introduce how to set up CMake, GDB and Valgrind in Docker containers.

Recently we were testing our c program in ubuntu, but we didnt have enough machine and the priority to build the VM, so my colleague and i decided to make a Dockerfile with c++ setting and run in the container

example from the github project (reference to https://github.com/leimao/CPP_Debug_Docker)

Clone the project

git clone https://github.com/LeoLiu1209/CPP_Debug_Docker.git

Create Docker image(already exists)

add some packages like vim, git, valgrind, gdb, cmake, build-essential….

 

FROM ubuntu:18.04


LABEL maintainer="Lei Mao <dukeleimao@gmail.com>"


# Install necessary dependencies

RUN apt-get update &&\

apt-get install -y --no-install-recommends \

build-essential \

autoconf \

automake \

libtool \

pkg-config \

apt-transport-https \

ca-certificates \

software-properties-common \

wget \

git \

curl \

gnupg \

zlib1g-dev \

swig \

vim \

gdb \

valgrind \

locales \

locales-all &&\

apt-get clean


# Install CMake

RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | apt-key add - &&\

apt-add-repository "deb https://apt.kitware.com/ubuntu/ bionic main" &&\

apt-get update &&\

apt-get install -y cmake


ENV LC_ALL en_US.UTF-8

ENV LANG en_US.UTF-8

ENV LANGUAGE en_US.UTF-8

build the docker image

  • -f: Dockerfile path
  • -t: Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
docker build -f Dockerfile -t cppdebug:0.1 .

Start Docker Container

  • -v : volume path, link current local path to docker /mnt directory
docker run -it --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -v $(pwd):/mnt cppdebug:0.1

ps: if you want ot using gdb as debugger in docker, it’s important to set the arguments --cap-add=SYS_PTRACE and --security-opt seccomp=unconfined both of them are required for C++ memory profiling and debugging in Docker.

reference:

GDB Done!!!

CMakeList.txt:

Here is my CMakeLists.txt file that CMake to generate the platform-specific Makefiles for C++ demo programs

 

cmake_minimum_required(VERSION 3.13.0)


project(DEBUG_DEMO VERSION 0.0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)


# Non-optimized code with debug symbols

# This is equivalent to `g++ -g xxx.cpp -o xxx`

set(CMAKE_BUILD_TYPE Debug)

# Optimized code with debug symbols

#set(CMAKE_BUILD_TYPE RelWithDebInfo)

# Optimized code for release

#set(CMAKE_BUILD_TYPE Release)


add_library(header header.cpp)


add_executable(logicalError logicalError.cpp)

target_link_libraries(logicalError PRIVATE header)


add_executable(coreDumped coreDumped.cpp)


add_executable(memoryLeak memoryLeak.cpp)

 

Let’s do it with cmake

cd mnt # docker file path link to local path
cmake . #Current workspace
make #build the binary

Memory Leak checker -Valgrind

we use Valgrind to check for the memory leak, so this time we add valgrind to makefile then you dont need to type it again and again

Option: --leak-check=yes

do make clean to clean the binary


cmake_minimum_required(VERSION 3.13.0)


project(DEBUG_DEMO VERSION 0.0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)


# Non-optimized code with debug symbols

# This is equivalent to `g++ -g xxx.cpp -o xxx`

set(CMAKE_BUILD_TYPE Debug)

# Optimized code with debug symbols

#set(CMAKE_BUILD_TYPE RelWithDebInfo)

# Optimized code for release

# set(CMAKE_BUILD_TYPE Release)


add_library(header header.cpp)


add_executable(logicalError logicalError.cpp)

target_link_libraries(logicalError PRIVATE header)


add_executable(coreDumped coreDumped.cpp)


add_executable(memoryLeak memoryLeak.cpp)


find_program(VALGRIND "valgrind")

if(VALGRIND)

add_custom_target(valgrind COMMAND "${VALGRIND}" --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes $<TARGET_FILE:memoryLeak>)

endif()

cmake again cmake . then you can using make valgrind now!!!!

I have to say that Docker really save our life!!!!!!!!!!!

short note for u and me ❤️

No comments:

Post a Comment