summaryrefslogtreecommitdiffstats
path: root/runtime/runtime_linux.cc
diff options
context:
space:
mode:
authorAndreas Gampe <agampe@google.com>2015-01-07 22:08:35 -0800
committerAndreas Gampe <agampe@google.com>2015-01-08 09:35:31 -0800
commit628a61ac52a8a314e74ab445397add60b4e72a5b (patch)
treedf78aa48e31e58669c6ae63ace7ba6bb532ec65d /runtime/runtime_linux.cc
parent4270e74152d8a7cd979ab5a92fe2a8f84adb8a42 (diff)
downloadart-628a61ac52a8a314e74ab445397add60b4e72a5b.tar.gz
art-628a61ac52a8a314e74ab445397add60b4e72a5b.tar.bz2
art-628a61ac52a8a314e74ab445397add60b4e72a5b.zip
ART: Pass ucontext to Backtrace in Stack Dump
In case of an unexpected signal on the host we dump the thread stack ourselves. We have to pass the context given to the signal handler, as the signal handler is run on an alternate stack. Otherwise libbacktrace can't dump the actual faulty part. Bug: 18933933 Change-Id: Id2710d2fd44b7c3b3335973a9288979a5793638b
Diffstat (limited to 'runtime/runtime_linux.cc')
-rw-r--r--runtime/runtime_linux.cc11
1 files changed, 9 insertions, 2 deletions
diff --git a/runtime/runtime_linux.cc b/runtime/runtime_linux.cc
index 1de035c0d5..a5a02042ac 100644
--- a/runtime/runtime_linux.cc
+++ b/runtime/runtime_linux.cc
@@ -35,9 +35,16 @@ namespace art {
static constexpr bool kDumpHeapObjectOnSigsevg = false;
struct Backtrace {
+ public:
+ explicit Backtrace(void* raw_context) : raw_context_(raw_context) {}
void Dump(std::ostream& os) const {
- DumpNativeStack(os, GetTid(), "\t");
+ DumpNativeStack(os, GetTid(), "\t", nullptr, raw_context_);
}
+ private:
+ // Stores the context of the signal that was unexpected and will terminate the runtime. The
+ // DumpNativeStack code will take care of casting it to the expected type. This is required
+ // as our signal handler runs on an alternate stack.
+ void* raw_context_;
};
struct OsInfo {
@@ -298,7 +305,7 @@ void HandleUnexpectedSignal(int signal_number, siginfo_t* info, void* raw_contex
pid_t tid = GetTid();
std::string thread_name(GetThreadName(tid));
UContext thread_context(raw_context);
- Backtrace thread_backtrace;
+ Backtrace thread_backtrace(raw_context);
LOG(INTERNAL_FATAL) << "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\n"
<< StringPrintf("Fatal signal %d (%s), code %d (%s)",