Hit ctrl + shift + p and select Reopen in Container
. The .devcontainer config will refer to the Dockerfile.local, which is a copy of the Dockerfile but with the entrypoint commented out.
This requires an oauth key passed into the .env file (rename sample.env to .env and fill in the key).
docker compose up
- The bind mount (map to local file system of this repo) is in /workspaces/c-debugging inside the container you may need to switch to that directory once inside.
You can access the container on the tailnet. Currently, it won't work locally unless the entrypoint is commented out.
- c/c++ (you will need the lldb extension to debug; notes below)
- python (python3 and pip3 are installed)
- go (you may have to get into the ~/.bashrc file and insert the line
export PATH="$PATH:/usr/local/go/bin:/go/bin"
)
:::info This will work for c and c++. You will need 2 ide extensions, one local (on your machine) and one remote (in the container). :::
- Have the Docker daemon running on your machine.
- Install the Dev Containers Extension locally.
- Jump into the repo root and hit
cmd + shift + p
and selectReopen in Container
. - Install the CodeLLDB Extension in the container (if not done automatically by the devcontainer.json config file in the root of this repo).
- Open any c or c++ file and go to the debugger window
cmd + shift + d
. - Click on the green play button to run the launch configuration
lldb
.
C++ is a superset of C, just extern C functions in C++ files due to the way C++ handles overloading.
extern "C" {
void my_c_function();
}
:::warning You will be prompted to install the C++ extension in the container, but it is not strictly necessary with this setup. :::
- lldb means llvm debugger; it hooks into the compiler architecture of llvm which is the next generation of compiler for c/c++
- clang++ uses llvm and is the compiler for c/c++
- a c/c++ file needs to be compiled with the -g flag to enable debugger metadata, which is then used by lldb
- the launch config does just what a terminal session would do but dynamically for the active file in the ide and it runs the build task (clang++ with -g flag) beforehand to enable debugging in the window for active file.
- .vscode/launch.json
// launch config
{
"version": "0.2.0",
"configurations": [
{
"name": "lldb",
"type": "lldb",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"cwd": "${workspaceFolder}",
"preLaunchTask": "clang++"
}
]
}
- .vscode/tasks.json
// build task
{
"version": "2.0.0",
"tasks": [
{
"label": "clang++",
"type": "shell",
"command": "/usr/bin/clang++",
"args": [
"-std=c++17",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
]
}
]
}
- Dockerfile
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
build-essential \
clang \
gdb \
cmake \
git \
curl \
vim \
lldb \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
RUN pip3 install matplotlib numpy
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 10
CMD ["bash"]
- .devcontainer/devcontainer.json
// https://code.visualstudio.com/docs/devcontainers/containers#_create-a-devcontainerjson-file
{
"name": "Existing Dockerfile",
"build": {
"context": "..",
"dockerfile": "../Dockerfile"
},
"customizations": {
"vscode": {
"extensions": ["vadimcn.vscode-lldb"]
}
}
}
dockerstop() {
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker volume rm $(docker volume ls -q)
}
# get the shell type to get the correct shell config
echo $SHELL
# assuming bash and bashrc is the shell and config file
# add go to path
cat << 'EOF' >> ~/.bashrc
export PATH=$PATH:/usr/local/go/bin:/go/bin
EOF