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 <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <signal.h> | 9 #include <signal.h> |
10 #include <stddef.h> | 10 #include <stddef.h> |
11 #include <stdint.h> | 11 #include <stdint.h> |
12 #include <stdio.h> | 12 #include <stdio.h> |
13 #include <stdlib.h> | 13 #include <stdlib.h> |
14 #include <sys/param.h> | 14 #include <sys/param.h> |
15 #include <sys/stat.h> | 15 #include <sys/stat.h> |
16 #include <sys/types.h> | 16 #include <sys/types.h> |
17 #include <unistd.h> | 17 #include <unistd.h> |
18 | 18 |
19 #include <map> | 19 #include <map> |
20 #include <memory> | |
20 #include <ostream> | 21 #include <ostream> |
21 #include <string> | 22 #include <string> |
22 #include <vector> | 23 #include <vector> |
23 | 24 |
24 #include "base/memory/free_deleter.h" | 25 #include "base/memory/free_deleter.h" |
25 | 26 |
26 #if defined(__GLIBCXX__) | 27 #if defined(__GLIBCXX__) |
27 #include <cxxabi.h> | 28 #include <cxxabi.h> |
28 #endif | 29 #endif |
29 #if !defined(__UCLIBC__) | 30 #if !defined(__UCLIBC__) |
30 #include <execinfo.h> | 31 #include <execinfo.h> |
31 #endif | 32 #endif |
32 | 33 |
33 #if defined(OS_MACOSX) | 34 #if defined(OS_MACOSX) |
34 #include <AvailabilityMacros.h> | 35 #include <AvailabilityMacros.h> |
35 #endif | 36 #endif |
36 | 37 |
37 #include "base/debug/debugger.h" | 38 #include "base/debug/debugger.h" |
38 #include "base/debug/proc_maps_linux.h" | 39 #include "base/debug/proc_maps_linux.h" |
39 #include "base/logging.h" | 40 #include "base/logging.h" |
40 #include "base/macros.h" | 41 #include "base/macros.h" |
41 #include "base/memory/scoped_ptr.h" | |
42 #include "base/memory/singleton.h" | 42 #include "base/memory/singleton.h" |
43 #include "base/numerics/safe_conversions.h" | 43 #include "base/numerics/safe_conversions.h" |
44 #include "base/posix/eintr_wrapper.h" | 44 #include "base/posix/eintr_wrapper.h" |
45 #include "base/strings/string_number_conversions.h" | 45 #include "base/strings/string_number_conversions.h" |
46 #include "build/build_config.h" | 46 #include "build/build_config.h" |
47 | 47 |
48 #if defined(USE_SYMBOLIZE) | 48 #if defined(USE_SYMBOLIZE) |
49 #include "base/third_party/symbolize/symbolize.h" | 49 #include "base/third_party/symbolize/symbolize.h" |
50 #endif | 50 #endif |
51 | 51 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
92 std::string::size_type mangled_end = | 92 std::string::size_type mangled_end = |
93 text->find_first_not_of(kSymbolCharacters, mangled_start); | 93 text->find_first_not_of(kSymbolCharacters, mangled_start); |
94 if (mangled_end == std::string::npos) { | 94 if (mangled_end == std::string::npos) { |
95 mangled_end = text->size(); | 95 mangled_end = text->size(); |
96 } | 96 } |
97 std::string mangled_symbol = | 97 std::string mangled_symbol = |
98 text->substr(mangled_start, mangled_end - mangled_start); | 98 text->substr(mangled_start, mangled_end - mangled_start); |
99 | 99 |
100 // Try to demangle the mangled symbol candidate. | 100 // Try to demangle the mangled symbol candidate. |
101 int status = 0; | 101 int status = 0; |
102 scoped_ptr<char, base::FreeDeleter> demangled_symbol( | 102 std::unique_ptr<char, base::FreeDeleter> demangled_symbol( |
103 abi::__cxa_demangle(mangled_symbol.c_str(), NULL, 0, &status)); | 103 abi::__cxa_demangle(mangled_symbol.c_str(), NULL, 0, &status)); |
104 if (status == 0) { // Demangling is successful. | 104 if (status == 0) { // Demangling is successful. |
105 // Remove the mangled symbol. | 105 // Remove the mangled symbol. |
106 text->erase(mangled_start, mangled_end - mangled_start); | 106 text->erase(mangled_start, mangled_end - mangled_start); |
107 // Insert the demangled symbol. | 107 // Insert the demangled symbol. |
108 text->insert(mangled_start, demangled_symbol.get()); | 108 text->insert(mangled_start, demangled_symbol.get()); |
109 // Next time, we'll start right after the demangled symbol we inserted. | 109 // Next time, we'll start right after the demangled symbol we inserted. |
110 search_from = mangled_start + strlen(demangled_symbol.get()); | 110 search_from = mangled_start + strlen(demangled_symbol.get()); |
111 } else { | 111 } else { |
112 // Failed to demangle. Retry after the "_Z" we just found. | 112 // Failed to demangle. Retry after the "_Z" we just found. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
173 handler->HandleOutput("<unknown>"); | 173 handler->HandleOutput("<unknown>"); |
174 | 174 |
175 handler->HandleOutput("\n"); | 175 handler->HandleOutput("\n"); |
176 } | 176 } |
177 #else | 177 #else |
178 bool printed = false; | 178 bool printed = false; |
179 | 179 |
180 // Below part is async-signal unsafe (uses malloc), so execute it only | 180 // Below part is async-signal unsafe (uses malloc), so execute it only |
181 // when we are not executing the signal handler. | 181 // when we are not executing the signal handler. |
182 if (in_signal_handler == 0) { | 182 if (in_signal_handler == 0) { |
183 scoped_ptr<char*, FreeDeleter> | 183 std::unique_ptr<char*, FreeDeleter> trace_symbols( |
Nico
2016/04/04 17:14:55
(file doesn't iwyu for freedeleter i think)
dcheng
2016/04/04 17:43:38
Note that this CL isn't attempt to address IWYU gl
| |
184 trace_symbols(backtrace_symbols(trace, size)); | 184 backtrace_symbols(trace, size)); |
185 if (trace_symbols.get()) { | 185 if (trace_symbols.get()) { |
186 for (size_t i = 0; i < size; ++i) { | 186 for (size_t i = 0; i < size; ++i) { |
187 std::string trace_symbol = trace_symbols.get()[i]; | 187 std::string trace_symbol = trace_symbols.get()[i]; |
188 DemangleSymbols(&trace_symbol); | 188 DemangleSymbols(&trace_symbol); |
189 handler->HandleOutput(trace_symbol.c_str()); | 189 handler->HandleOutput(trace_symbol.c_str()); |
190 handler->HandleOutput("\n"); | 190 handler->HandleOutput("\n"); |
191 } | 191 } |
192 | 192 |
193 printed = true; | 193 printed = true; |
194 } | 194 } |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
805 *ptr = *start; | 805 *ptr = *start; |
806 *start++ = ch; | 806 *start++ = ch; |
807 } | 807 } |
808 return buf; | 808 return buf; |
809 } | 809 } |
810 | 810 |
811 } // namespace internal | 811 } // namespace internal |
812 | 812 |
813 } // namespace debug | 813 } // namespace debug |
814 } // namespace base | 814 } // namespace base |
OLD | NEW |