Index: base/debug/stack_trace_unittest.cc |
diff --git a/base/debug/stack_trace_unittest.cc b/base/debug/stack_trace_unittest.cc |
index 9abedba6bafd91160989fb718cebc78b4fafbdf6..af53a147766cad1969b0ac8cf52b8ec3dc621e17 100644 |
--- a/base/debug/stack_trace_unittest.cc |
+++ b/base/debug/stack_trace_unittest.cc |
@@ -238,5 +238,61 @@ TEST_F(StackTraceTest, itoa_r) { |
} |
#endif // defined(OS_POSIX) && !defined(OS_ANDROID) |
+#if HAVE_TRACE_STACK_FRAME_POINTERS |
+ |
+TEST_F(StackTraceTest, TraceStackFramePointers) { |
+ const void* fp_frames[10]; |
+ size_t fp_frame_count = |
+ TraceStackFramePointers(fp_frames, arraysize(fp_frames), 0); |
+ |
+ // We expect to fill the whole frame array |
+ ASSERT_EQ(arraysize(fp_frames), fp_frame_count); |
+ |
+ // Compare against StackTrace |
+ |
+ StackTrace stack_trace; |
+ size_t frame_count = 0; |
+ const void* const* frames = stack_trace.Addresses(&frame_count); |
+ |
+ // Find offsets into both frame arrays that have matching frames |
+ size_t fp_frames_offset = 0; |
+ size_t frames_offset = 0; |
+ bool found_matching_frame = false; |
+ for (;fp_frames_offset != fp_frame_count; ++fp_frames_offset) { |
+ const void* frame = fp_frames[fp_frames_offset]; |
+ for (frames_offset = 0; frames_offset != frame_count; ++frames_offset) { |
+ if (frames[frames_offset] == frame) { |
+ found_matching_frame = true; |
+ break; |
+ } |
+ } |
+ if (found_matching_frame) { |
+ break; |
+ } |
+ } |
+ |
+ ASSERT_TRUE(found_matching_frame) << |
+ "StackTrace class and TraceStackFramePointers function produced " << |
+ "completely different traces."; |
+ |
+ // fp_frames[0] points somewhere inside this function and differs from |
+ // location reported by StackFrame (since invocations are on different |
+ // lines). However fp_frames[1] points to the caller function, and should |
+ // be in both frame arrays. |
+ ASSERT_EQ(fp_frames_offset, 1u); |
+ |
+ size_t check_depth = std::min(fp_frame_count - fp_frames_offset, |
+ frame_count - frames_offset); |
+ for (size_t i = 0; i != check_depth; ++i) { |
+ size_t fp_frame_index = i + fp_frames_offset; |
+ size_t frame_index = i + frames_offset; |
+ EXPECT_EQ(frames[frame_index], fp_frames[fp_frame_index]) << |
+ "Where frame_index = " << frame_index << ", " << |
+ "fp_frame_index = " << fp_frame_index; |
+ } |
+} |
+ |
+#endif // HAVE_TRACE_STACK_FRAME_POINTERS |
+ |
} // namespace debug |
} // namespace base |