diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2014-07-11 08:26:40 +0000 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2014-07-11 08:26:40 +0000 |
commit | 0025a86411145eb7cd4971f9234fc21c7b4aced1 (patch) | |
tree | 933b8b96ea970c23a7b3ce313c7c6d46f807dadd /runtime/fault_handler.cc | |
parent | 7fb36ded9cd5b1d254b63b3091f35c1e6471b90e (diff) | |
download | art-0025a86411145eb7cd4971f9234fc21c7b4aced1.zip art-0025a86411145eb7cd4971f9234fc21c7b4aced1.tar.gz art-0025a86411145eb7cd4971f9234fc21c7b4aced1.tar.bz2 |
Revert "Revert "Revert "Add implicit null and stack checks for x86"""
Broke the build.
This reverts commit 7fb36ded9cd5b1d254b63b3091f35c1e6471b90e.
Change-Id: I9df0e7446ff0913a0e1276a558b2ccf6c8f4c949
Diffstat (limited to 'runtime/fault_handler.cc')
-rw-r--r-- | runtime/fault_handler.cc | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/runtime/fault_handler.cc b/runtime/fault_handler.cc index f99ce07..3112bc0 100644 --- a/runtime/fault_handler.cc +++ b/runtime/fault_handler.cc @@ -29,7 +29,9 @@ #include "mirror/object-inl.h" #include "object_utils.h" #include "scoped_thread_state_change.h" +#ifdef HAVE_ANDROID_OS #include "sigchain.h" +#endif #include "verify_object-inl.h" namespace art { @@ -45,7 +47,6 @@ void art_sigsegv_fault() { // Signal handler called on SIGSEGV. static void art_fault_handler(int sig, siginfo_t* info, void* context) { - // std::cout << "handling fault in ART handler\n"; fault_manager.HandleFault(sig, info, context); } @@ -54,7 +55,9 @@ FaultManager::FaultManager() { } FaultManager::~FaultManager() { +#ifdef HAVE_ANDROID_OS UnclaimSignalChain(SIGSEGV); +#endif sigaction(SIGSEGV, &oldaction_, nullptr); // Restore old handler. } @@ -69,12 +72,11 @@ void FaultManager::Init() { #endif // Set our signal handler now. - int e = sigaction(SIGSEGV, &action, &oldaction_); - if (e != 0) { - VLOG(signals) << "Failed to claim SEGV: " << strerror(errno); - } + sigaction(SIGSEGV, &action, &oldaction_); +#ifdef HAVE_ANDROID_OS // Make sure our signal handler is called before any user handlers. ClaimSignalChain(SIGSEGV, &oldaction_); +#endif } void FaultManager::HandleFault(int sig, siginfo_t* info, void* context) { @@ -82,12 +84,8 @@ void FaultManager::HandleFault(int sig, siginfo_t* info, void* context) { // // If malloc calls abort, it will be holding its lock. // If the handler tries to call malloc, it will deadlock. - - // Also, there is only an 8K stack available here to logging can cause memory - // overwrite issues if you are unlucky. If you want to enable logging and - // are getting crashes, allocate more space for the alternate signal stack. VLOG(signals) << "Handling fault"; - if (IsInGeneratedCode(info, context, true)) { + if (IsInGeneratedCode(context, true)) { VLOG(signals) << "in generated code, looking for handler"; for (const auto& handler : generated_code_handlers_) { VLOG(signals) << "invoking Action on handler " << handler; @@ -103,8 +101,11 @@ void FaultManager::HandleFault(int sig, siginfo_t* info, void* context) { } art_sigsegv_fault(); - // Pass this on to the next handler in the chain, or the default if none. +#ifdef HAVE_ANDROID_OS InvokeUserSignalHandler(sig, info, context); +#else + oldaction_.sa_sigaction(sig, info, context); +#endif } void FaultManager::AddHandler(FaultHandler* handler, bool generated_code) { @@ -131,7 +132,7 @@ void FaultManager::RemoveHandler(FaultHandler* handler) { // This function is called within the signal handler. It checks that // the mutator_lock is held (shared). No annotalysis is done. -bool FaultManager::IsInGeneratedCode(siginfo_t* siginfo, void* context, bool check_dex_pc) { +bool FaultManager::IsInGeneratedCode(void* context, bool check_dex_pc) { // We can only be running Java code in the current thread if it // is in Runnable state. VLOG(signals) << "Checking for generated code"; @@ -160,7 +161,7 @@ bool FaultManager::IsInGeneratedCode(siginfo_t* siginfo, void* context, bool che // Get the architecture specific method address and return address. These // are in architecture specific files in arch/<arch>/fault_handler_<arch>. - GetMethodAndReturnPCAndSP(siginfo, context, &method_obj, &return_pc, &sp); + GetMethodAndReturnPCAndSP(context, &method_obj, &return_pc, &sp); // If we don't have a potential method, we're outta here. VLOG(signals) << "potential method: " << method_obj; @@ -241,12 +242,12 @@ JavaStackTraceHandler::JavaStackTraceHandler(FaultManager* manager) : FaultHandl bool JavaStackTraceHandler::Action(int sig, siginfo_t* siginfo, void* context) { // Make sure that we are in the generated code, but we may not have a dex pc. - if (manager_->IsInGeneratedCode(siginfo, context, false)) { + if (manager_->IsInGeneratedCode(context, false)) { LOG(ERROR) << "Dumping java stack trace for crash in generated code"; mirror::ArtMethod* method = nullptr; uintptr_t return_pc = 0; uintptr_t sp = 0; - manager_->GetMethodAndReturnPCAndSP(siginfo, context, &method, &return_pc, &sp); + manager_->GetMethodAndReturnPCAndSP(context, &method, &return_pc, &sp); Thread* self = Thread::Current(); // Inside of generated code, sp[0] is the method, so sp is the frame. StackReference<mirror::ArtMethod>* frame = |