| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/debug/stack_trace.h" | 5 #include "base/debug/stack_trace.h" |
| 6 | 6 |
| 7 #include <android/log.h> | 7 #include <android/log.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <unwind.h> | 9 #include <unwind.h> |
| 10 |
| 11 #include <algorithm> |
| 10 #include <ostream> | 12 #include <ostream> |
| 11 | 13 |
| 12 #include "base/debug/proc_maps_linux.h" | 14 #include "base/debug/proc_maps_linux.h" |
| 13 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 14 #include "base/threading/thread_restrictions.h" | 16 #include "base/threading/thread_restrictions.h" |
| 15 | 17 |
| 16 #ifdef __LP64__ | 18 #ifdef __LP64__ |
| 17 #define FMT_ADDR "0x%016lx" | 19 #define FMT_ADDR "0x%016lx" |
| 18 #else | 20 #else |
| 19 #define FMT_ADDR "0x%08x" | 21 #define FMT_ADDR "0x%08x" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 // to be ignored. Therefore, when testing that same code, it should run | 62 // to be ignored. Therefore, when testing that same code, it should run |
| 61 // with SIGPIPE ignored as well. | 63 // with SIGPIPE ignored as well. |
| 62 // TODO(phajdan.jr): De-duplicate this SIGPIPE code. | 64 // TODO(phajdan.jr): De-duplicate this SIGPIPE code. |
| 63 struct sigaction action; | 65 struct sigaction action; |
| 64 memset(&action, 0, sizeof(action)); | 66 memset(&action, 0, sizeof(action)); |
| 65 action.sa_handler = SIG_IGN; | 67 action.sa_handler = SIG_IGN; |
| 66 sigemptyset(&action.sa_mask); | 68 sigemptyset(&action.sa_mask); |
| 67 return (sigaction(SIGPIPE, &action, NULL) == 0); | 69 return (sigaction(SIGPIPE, &action, NULL) == 0); |
| 68 } | 70 } |
| 69 | 71 |
| 70 StackTrace::StackTrace() { | 72 StackTrace::StackTrace(size_t count) { |
| 71 StackCrawlState state(reinterpret_cast<uintptr_t*>(trace_), kMaxTraces); | 73 count = std::min(arraysize(trace_), count); |
| 74 |
| 75 StackCrawlState state(reinterpret_cast<uintptr_t*>(trace_), count); |
| 72 _Unwind_Backtrace(&TraceStackFrame, &state); | 76 _Unwind_Backtrace(&TraceStackFrame, &state); |
| 73 count_ = state.frame_count; | 77 count_ = state.frame_count; |
| 74 } | 78 } |
| 75 | 79 |
| 76 void StackTrace::Print() const { | 80 void StackTrace::Print() const { |
| 77 std::string backtrace = ToString(); | 81 std::string backtrace = ToString(); |
| 78 __android_log_write(ANDROID_LOG_ERROR, "chromium", backtrace.c_str()); | 82 __android_log_write(ANDROID_LOG_ERROR, "chromium", backtrace.c_str()); |
| 79 } | 83 } |
| 80 | 84 |
| 81 // NOTE: Native libraries in APKs are stripped before installing. Print out the | 85 // NOTE: Native libraries in APKs are stripped before installing. Print out the |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 } else { | 125 } else { |
| 122 *os << "<unknown>"; | 126 *os << "<unknown>"; |
| 123 } | 127 } |
| 124 | 128 |
| 125 *os << "\n"; | 129 *os << "\n"; |
| 126 } | 130 } |
| 127 } | 131 } |
| 128 | 132 |
| 129 } // namespace debug | 133 } // namespace debug |
| 130 } // namespace base | 134 } // namespace base |
| OLD | NEW |