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 <windows.h> | 7 #include <windows.h> |
8 #include <dbghelp.h> | 8 #include <dbghelp.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 | 10 |
| 11 #include <algorithm> |
11 #include <iostream> | 12 #include <iostream> |
12 #include <memory> | 13 #include <memory> |
13 | 14 |
14 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
15 #include "base/logging.h" | 16 #include "base/logging.h" |
16 #include "base/macros.h" | 17 #include "base/macros.h" |
17 #include "base/memory/singleton.h" | 18 #include "base/memory/singleton.h" |
18 #include "base/synchronization/lock.h" | 19 #include "base/synchronization/lock.h" |
19 | 20 |
20 namespace base { | 21 namespace base { |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 | 203 |
203 // Disable optimizations for the StackTrace::StackTrace function. It is | 204 // Disable optimizations for the StackTrace::StackTrace function. It is |
204 // important to disable at least frame pointer optimization ("y"), since | 205 // important to disable at least frame pointer optimization ("y"), since |
205 // that breaks CaptureStackBackTrace() and prevents StackTrace from working | 206 // that breaks CaptureStackBackTrace() and prevents StackTrace from working |
206 // in Release builds (it may still be janky if other frames are using FPO, | 207 // in Release builds (it may still be janky if other frames are using FPO, |
207 // but at least it will make it further). | 208 // but at least it will make it further). |
208 #if defined(COMPILER_MSVC) | 209 #if defined(COMPILER_MSVC) |
209 #pragma optimize("", off) | 210 #pragma optimize("", off) |
210 #endif | 211 #endif |
211 | 212 |
212 StackTrace::StackTrace() { | 213 StackTrace::StackTrace(size_t count) { |
| 214 count = std::min(arraysize(trace_), count); |
| 215 |
213 // When walking our own stack, use CaptureStackBackTrace(). | 216 // When walking our own stack, use CaptureStackBackTrace(). |
214 count_ = CaptureStackBackTrace(0, arraysize(trace_), trace_, NULL); | 217 count_ = CaptureStackBackTrace(0, count, trace_, NULL); |
215 } | 218 } |
216 | 219 |
217 #if defined(COMPILER_MSVC) | 220 #if defined(COMPILER_MSVC) |
218 #pragma optimize("", on) | 221 #pragma optimize("", on) |
219 #endif | 222 #endif |
220 | 223 |
221 StackTrace::StackTrace(EXCEPTION_POINTERS* exception_pointers) { | 224 StackTrace::StackTrace(EXCEPTION_POINTERS* exception_pointers) { |
222 InitTrace(exception_pointers->ContextRecord); | 225 InitTrace(exception_pointers->ContextRecord); |
223 } | 226 } |
224 | 227 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 (*os) << "\t" << trace_[i] << "\n"; | 287 (*os) << "\t" << trace_[i] << "\n"; |
285 } | 288 } |
286 } else { | 289 } else { |
287 (*os) << "Backtrace:\n"; | 290 (*os) << "Backtrace:\n"; |
288 context->OutputTraceToStream(trace_, count_, os); | 291 context->OutputTraceToStream(trace_, count_, os); |
289 } | 292 } |
290 } | 293 } |
291 | 294 |
292 } // namespace debug | 295 } // namespace debug |
293 } // namespace base | 296 } // namespace base |
OLD | NEW |