diff options
| author | 2018-07-13 16:25:18 +0000 | |
|---|---|---|
| committer | 2018-07-13 16:25:18 +0000 | |
| commit | ec1f1a91328f44d93cfc16e39160dbdfce2f7b9a (patch) | |
| tree | e553db8b22519b7e19877caf45701058f2e24799 | |
| parent | e8c91f2d97101a967ce45d7cbb3d7606bfb4862e (diff) | |
| parent | 7d3256a376709145d6c402a13b1977350816aec2 (diff) | |
Merge "Revert "Move GCStress BacktraceHelper to libbacktrace""
| -rw-r--r-- | runtime/Android.bp | 1 | ||||
| -rw-r--r-- | runtime/backtrace_helper.cc | 76 | ||||
| -rw-r--r-- | runtime/backtrace_helper.h | 23 |
3 files changed, 19 insertions, 81 deletions
diff --git a/runtime/Android.bp b/runtime/Android.bp index 6ec626591a..8411982b30 100644 --- a/runtime/Android.bp +++ b/runtime/Android.bp @@ -31,7 +31,6 @@ libart_cc_defaults { "aot_class_linker.cc", "art_field.cc", "art_method.cc", - "backtrace_helper.cc", "barrier.cc", "base/mem_map_arena_pool.cc", "base/mutex.cc", diff --git a/runtime/backtrace_helper.cc b/runtime/backtrace_helper.cc deleted file mode 100644 index c2c0ceeaee..0000000000 --- a/runtime/backtrace_helper.cc +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "backtrace_helper.h" - -#if defined(__linux__) - -#include <backtrace/Backtrace.h> -#include <backtrace/BacktraceMap.h> - -#include <unistd.h> -#include <sys/types.h> - -#else - -// For UNUSED -#include "base/macros.h" - -#endif - -namespace art { - -// We only really support libbacktrace on linux which is unfortunate but since this is only for -// gcstress this isn't a huge deal. -#if defined(__linux__) - -void BacktraceCollector::Collect() { - std::unique_ptr<BacktraceMap> map(BacktraceMap::Create(getpid())); - // We don't care about the function names. Turning this off makes everything significantly faster. - map->SetResolveNames(false); - std::unique_ptr<Backtrace> backtrace(Backtrace::Create(BACKTRACE_CURRENT_PROCESS, - BACKTRACE_CURRENT_THREAD, - map.get())); - backtrace->SetSkipFrames(true); - if (!backtrace->Unwind(skip_count_, nullptr)) { - return; - } - for (Backtrace::const_iterator it = backtrace->begin(); - max_depth_ > num_frames_ && it != backtrace->end(); - ++it) { - out_frames_[num_frames_++] = static_cast<uintptr_t>(it->pc); - } -} - -#else - -#pragma clang diagnostic push -#pragma clang diagnostic warning "-W#warnings" -#warning "Backtrace collector is not implemented. GCStress cannot be used." -#pragma clang diagnostic pop - -// We only have an implementation for linux. On other plaforms just return nothing. This is not -// really correct but we only use this for hashing and gcstress so it's not too big a deal. -void BacktraceCollector::Collect() { - UNUSED(skip_count_); - UNUSED(out_frames_); - UNUSED(max_depth_); - num_frames_ = 0; -} - -#endif - -} // namespace art diff --git a/runtime/backtrace_helper.h b/runtime/backtrace_helper.h index 8eda3fa0a1..ace118c50b 100644 --- a/runtime/backtrace_helper.h +++ b/runtime/backtrace_helper.h @@ -17,12 +17,11 @@ #ifndef ART_RUNTIME_BACKTRACE_HELPER_H_ #define ART_RUNTIME_BACKTRACE_HELPER_H_ -#include <stddef.h> -#include <stdint.h> +#include <unwind.h> namespace art { -// Using libbacktrace +// Based on debug malloc logic from libc/bionic/debug_stacktrace.cpp. class BacktraceCollector { public: BacktraceCollector(uintptr_t* out_frames, size_t max_depth, size_t skip_count) @@ -33,9 +32,25 @@ class BacktraceCollector { } // Collect the backtrace, do not call more than once. - void Collect(); + void Collect() { + _Unwind_Backtrace(&Callback, this); + } private: + static _Unwind_Reason_Code Callback(_Unwind_Context* context, void* arg) { + auto* const state = reinterpret_cast<BacktraceCollector*>(arg); + const uintptr_t ip = _Unwind_GetIP(context); + // The first stack frame is get_backtrace itself. Skip it. + if (ip != 0 && state->skip_count_ > 0) { + --state->skip_count_; + return _URC_NO_REASON; + } + // ip may be off for ARM but it shouldn't matter since we only use it for hashing. + state->out_frames_[state->num_frames_] = ip; + state->num_frames_++; + return state->num_frames_ >= state->max_depth_ ? _URC_END_OF_STACK : _URC_NO_REASON; + } + uintptr_t* const out_frames_ = nullptr; size_t num_frames_ = 0u; const size_t max_depth_ = 0u; |