Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(665)

Unified Diff: base/debug/stack_trace_android.cc

Issue 18337008: Clean up base/debug/stack_trace_android.cc. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nits Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/debug/stack_trace_android.cc
diff --git a/base/debug/stack_trace_android.cc b/base/debug/stack_trace_android.cc
index 4c11a244d6ee2f5513c560f67702de21ab924c5c..487cbc495c6b07bcea869bb88e94b280ff5a57ef 100644
--- a/base/debug/stack_trace_android.cc
+++ b/base/debug/stack_trace_android.cc
@@ -5,49 +5,40 @@
#include "base/debug/stack_trace.h"
#include <android/log.h>
-#include <unwind.h> // TODO(dmikurube): Remove. See http://crbug.com/236855.
+#include <unwind.h>
#include "base/debug/proc_maps_linux.h"
#include "base/strings/stringprintf.h"
-// TODO(dmikurube): Remove when Bionic's get_backtrace() gets popular.
-// See http://crbug.com/236855.
namespace {
-/* depends how the system includes define this */
-#ifdef HAVE_UNWIND_CONTEXT_STRUCT
-typedef struct _Unwind_Context __unwind_context;
-#else
-typedef _Unwind_Context __unwind_context;
-#endif
+struct StackCrawlState {
+ StackCrawlState(uintptr_t* frames, size_t max_depth)
+ : frames(frames),
+ frame_count(0),
+ max_depth(max_depth),
+ have_skipped_self(false) {}
-struct stack_crawl_state_t {
uintptr_t* frames;
size_t frame_count;
size_t max_depth;
bool have_skipped_self;
-
- stack_crawl_state_t(uintptr_t* frames, size_t max_depth)
- : frames(frames),
- frame_count(0),
- max_depth(max_depth),
- have_skipped_self(false) {
- }
};
-static _Unwind_Reason_Code tracer(__unwind_context* context, void* arg) {
- stack_crawl_state_t* state = static_cast<stack_crawl_state_t*>(arg);
-
+// Clang's unwind.h doesn't provide _Unwind_GetIP on ARM, refer to
+// http://llvm.org/bugs/show_bug.cgi?id=16564 for details.
#if defined(__clang__)
- // Vanilla Clang's unwind.h doesn't have _Unwind_GetIP for ARM.
- // See http://crbug.com/236855, too.
+uintptr_t _Unwind_GetIP(_Unwind_Context* context) {
uintptr_t ip = 0;
_Unwind_VRS_Get(context, _UVRSC_CORE, 15, _UVRSD_UINT32, &ip);
- ip &= ~(uintptr_t)0x1; // remove thumb mode bit
-#else
- uintptr_t ip = _Unwind_GetIP(context);
+ return ip & ~static_cast<uintptr_t>(0x1); // Remove thumb mode bit.
+}
#endif
+_Unwind_Reason_Code TraceStackFrame(_Unwind_Context* context, void* arg) {
+ StackCrawlState* state = static_cast<StackCrawlState*>(arg);
+ uintptr_t ip = _Unwind_GetIP(context);
+
// The first stack frame is this function itself. Skip it.
if (ip != 0 && !state->have_skipped_self) {
state->have_skipped_self = true;
@@ -57,8 +48,7 @@ static _Unwind_Reason_Code tracer(__unwind_context* context, void* arg) {
state->frames[state->frame_count++] = ip;
if (state->frame_count >= state->max_depth)
return _URC_END_OF_STACK;
- else
- return _URC_NO_REASON;
+ return _URC_NO_REASON;
}
} // namespace
@@ -79,12 +69,9 @@ bool EnableInProcessStackDumping() {
}
StackTrace::StackTrace() {
- // TODO(dmikurube): Replace it with Bionic's get_backtrace().
- // See http://crbug.com/236855.
- stack_crawl_state_t state(reinterpret_cast<uintptr_t*>(trace_), kMaxTraces);
- _Unwind_Backtrace(tracer, &state);
+ StackCrawlState state(reinterpret_cast<uintptr_t*>(trace_), kMaxTraces);
+ _Unwind_Backtrace(&TraceStackFrame, &state);
count_ = state.frame_count;
- // TODO(dmikurube): Symbolize in Chrome.
}
void StackTrace::PrintBacktrace() const {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698