Search code examples
gcccoredumpaddress-sanitizer

gcc address sanitizer core dump on error


I'm trying to do some debugging on a server on an issue that I suspect is related to a buffer overflow, so I tried to compile my code with -fsanitize=address to enable address sanitizing.

It compiled, and the resulting software runs. However, I'm trying to get a core dump when the address sanitizer detects an error since that is pretty much the only way I can get information out of the system due to the setup.

I am calling the software with ASAN_OPTIONS=abort_on_error=1 prepended on the command line (using a shell script to do that), and have checked that ulimit -c gives unlimited as result, but it just won't produce a core dump.

What am I missing?

This is on an ubuntu 14.04 server with gcc version 4.8.4

EDIT: sysctl kernel.core_pattern gives back kernel.core_pattern = |/usr/share/apport/apport %p %s %c %P. This probably means that apport is enabled (at least in some form). However, I have been able to get proper core files on this system from asserts and SIGFPEs in the software (that is where the suspicion of array overruns comes from).


Solution

  • Let me guess, is this x64 target? Coredumps are disabled there to avoid dumping 16 TB shadow memory (see docs for disable_coredump here for details).

    Newer versions of GCC/Clang remove shadow from core by default so that one could do something like

    export ASAN_OPTIONS=abort_on_error=1:disable_coredump=0
    

    but I'm afraid 4.8 is too old for this.

    As an alternative suggestion, why backtraces are not enough for you? You could use log_path or log_to_syslog to preserve them if you do not have access to programs stderr.

    NB: I posted suggestion to enable coredumps on all platforms.