Index: base/trace_event/heap_profiler_allocation_context_tracker.cc |
diff --git a/base/trace_event/heap_profiler_allocation_context_tracker.cc b/base/trace_event/heap_profiler_allocation_context_tracker.cc |
index 8c6f441e246a623eb64ba37e432bc0694ec7edae..64a9975baabc1a784f7ebaa1a695b858f6964895 100644 |
--- a/base/trace_event/heap_profiler_allocation_context_tracker.cc |
+++ b/base/trace_event/heap_profiler_allocation_context_tracker.cc |
@@ -204,18 +204,21 @@ bool AllocationContextTracker::GetContextSnapshot(AllocationContext* ctx) { |
// from main() and up. Stack unwinding produces top frames, i.e. |
// from this point and up until main(). We request many frames to |
// make sure we reach main(), and then copy bottom portion of them. |
+#if !defined(OS_NACL) // We don't build base/debug/stack_trace.cc for NaCl. |
+#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) |
const void* frames[128]; |
static_assert(arraysize(frames) >= Backtrace::kMaxFrameCount, |
"not requesting enough frames to fill Backtrace"); |
-#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) && !defined(OS_NACL) |
size_t frame_count = debug::TraceStackFramePointers( |
- frames, |
- arraysize(frames), |
- 1 /* exclude this function from the trace */ ); |
-#else |
- size_t frame_count = 0; |
- NOTREACHED(); |
-#endif |
+ frames, arraysize(frames), |
+ 1 /* exclude this function from the trace */); |
+#else // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) |
+ // Fall-back to capturing the stack with base::debug::StackTrace, |
+ // which is likely slower, but more reliable. |
+ base::debug::StackTrace stack_trace(Backtrace::kMaxFrameCount); |
+ size_t frame_count = 0u; |
+ const void* const* frames = stack_trace.Addresses(&frame_count); |
+#endif // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) |
// Copy frames backwards |
size_t backtrace_capacity = backtrace_end - backtrace; |
@@ -226,6 +229,7 @@ bool AllocationContextTracker::GetContextSnapshot(AllocationContext* ctx) { |
const void* frame = frames[i]; |
*backtrace++ = StackFrame::FromProgramCounter(frame); |
} |
+#endif // !defined(OS_NACL) |
break; |
} |
} |