summaryrefslogtreecommitdiffstats
path: root/runtime/runtime_linux.cc
diff options
context:
space:
mode:
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 1de035c0d..a5a02042a 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)",