diff --git a/compiler-rt/lib/memprof/memprof_rtl.cpp b/compiler-rt/lib/memprof/memprof_rtl.cpp --- a/compiler-rt/lib/memprof/memprof_rtl.cpp +++ b/compiler-rt/lib/memprof/memprof_rtl.cpp @@ -50,6 +50,14 @@ } } +static void MemprofOnDeadlySignal(int signo, void *siginfo, void *context) { + // We call StartReportDeadlySignal not HandleDeadlySignal so we get the + // deadly signal message to stderr but no writing to the profile output file + StartReportDeadlySignal(); + __memprof_profile_dump(); + Die(); +} + static void CheckUnwind() { GET_STACK_TRACE(kStackTraceMax, common_flags()->fast_unwind_on_check); stack.Print(); @@ -183,6 +191,7 @@ InitializeShadowMemory(); TSDInit(PlatformTSDDtor); + InstallDeadlySignalHandlers(MemprofOnDeadlySignal); InitializeAllocator(); diff --git a/compiler-rt/test/memprof/TestCases/memprof_profile_dump_on_abort.cpp b/compiler-rt/test/memprof/TestCases/memprof_profile_dump_on_abort.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/test/memprof/TestCases/memprof_profile_dump_on_abort.cpp @@ -0,0 +1,18 @@ +// RUN: %clangxx_memprof %s -o %t + +// RUN: %env_memprof_opts=print_text=true:log_path=stdout:handle_abort=1 not %run %t 2>&1 | FileCheck --check-prefix=CHECK-TEXT %s + +#include +#include +int main(int argc, char **argv) { + char *x = (char *)malloc(10); + memset(x, 0, 10); + free(x); + abort(); + return 0; +} + +// CHECK-TEXT: MemProfiler:DEADLYSIGNAL +// CHECK-TEXT: Recorded MIBs (incl. live on exit): +// CHECK-TEXT: Memory allocation stack id +// CHECK-TEXT: Stack for id