For projects using CircleCI 2.0, you can now get core dumps and push them as artifacts for inspection and debugging.
A contrived example
If you want to skip ahead to the configuration, go ahead.
In order to demonstrate this feature, we’ll create with a tiny C program that simply does an abort(3) to crash the program.
Starting with the Makefile:
all:
gcc -o dump main.c
Now let’s create our circle.yml.
#include <stdlib.h>
int main(int argc, char **argv) {
abort();
}
Now if we run make and ./dump on the generated program, we should see Aborted (core dumped)!
Let’s take a look at the full circle.yml for compiling this program, and collecting the core dumps as artifacts.
version: 2.0
jobs:
build:
docker:
- image: gcc:latest
working_directory: ~/work
steps:
- checkout
- run: make
- run: |
ulimit -c unlimited
./dump
- run:
command: |
mkdir -p /tmp/core_dumps
cp core.* /tmp/core_dumps
when: on_fail
- store_artifacts:
path: /tmp/core_dumps
The important parts here are ulimit -c unlimited which tells the operating system to remove the file size limit on core dump files.
With the limit removed, anytime a program crashes a dump file will be created in the current working directory. The name it will be given, as specified in /proc/sys/kernel/core_pattern will be core.%p.%E where %p is the process id and %E is the pathname of the executable.
Lastly, we copy the dump files to /tmp/core_dumps and send them off to the artifacts services with store_artifacts.
If we run a build, you should see the core dump file under the “Artifacts” tab of the build summary!
We welcome your feedback as we continue to develop and improve CircleCI 2.0: https://discuss.circleci.com/c/circleci-2-0/feedback
