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