diff options
author | Vitaly Buka <vitalybuka@google.com> | 2017-09-22 22:57:48 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2017-09-22 22:57:48 +0000 |
commit | 67a6c824cb6d0ab2c7b961f8e482bc1aedad3c27 (patch) | |
tree | e3ca06cdb05ac62af15b466656fac4817ce1142c /lib/lsan/lsan.cc | |
parent | 4365a0449cc7cba181357669774caf835f2ef9dd (diff) | |
download | compiler-rt-67a6c824cb6d0ab2c7b961f8e482bc1aedad3c27.tar.gz |
[lsan] Deadly signal handler for lsan
Summary: Part of https://github.com/google/sanitizers/issues/637
Reviewers: eugenis, alekseyshl
Subscribers: llvm-commits, dberris, kubamracek, krytarowski
Differential Revision: https://reviews.llvm.org/D37608
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@314041 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/lsan/lsan.cc')
-rw-r--r-- | lib/lsan/lsan.cc | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/lsan/lsan.cc b/lib/lsan/lsan.cc index 6c4767d61..a51a63ba8 100644 --- a/lib/lsan/lsan.cc +++ b/lib/lsan/lsan.cc @@ -65,6 +65,18 @@ static void InitializeFlags() { if (common_flags()->help) parser.PrintFlagDescriptions(); } +static void OnStackUnwind(const SignalContext &sig, const void *, + BufferedStackTrace *stack) { + GetStackTraceWithPcBpAndContext(stack, kStackTraceMax, sig.pc, sig.bp, + sig.context, + common_flags()->fast_unwind_on_fatal); +} + +void LsanOnDeadlySignal(int signo, void *siginfo, void *context) { + HandleDeadlySignal(siginfo, context, GetCurrentThread(), &OnStackUnwind, + nullptr); +} + extern "C" void __lsan_init() { CHECK(!lsan_init_is_running); if (lsan_inited) @@ -80,6 +92,7 @@ extern "C" void __lsan_init() { InitTlsSize(); InitializeInterceptors(); InitializeThreadRegistry(); + InstallDeadlySignalHandlers(LsanOnDeadlySignal); u32 tid = ThreadCreate(0, 0, true); CHECK_EQ(tid, 0); ThreadStart(tid, GetTid()); |