From cd546c11d679288d552d80b3e6caf965a9094c63 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 25 Oct 2017 15:21:45 -0700 Subject: [PATCH] libbacktrace: correctly number frames when skipping. Correct for the number of skipped frames when unwinding with libunwindstack. Test: backtrace_test32 --gtest_filter="unwind_frame_skip_*" Change-Id: I9528977104fde3c4ec792a6db1ada24ed571b867 --- libbacktrace/UnwindStack.cpp | 2 +- libbacktrace/backtrace_test.cpp | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libbacktrace/UnwindStack.cpp b/libbacktrace/UnwindStack.cpp index c3f08c81c..62e453fb8 100644 --- a/libbacktrace/UnwindStack.cpp +++ b/libbacktrace/UnwindStack.cpp @@ -64,7 +64,7 @@ bool Backtrace::Unwind(unwindstack::Regs* regs, BacktraceMap* back_map, auto frame = &unwinder_frames[i]; backtrace_frame_data_t* back_frame = &frames->at(cur_frame); - back_frame->num = frame->num; + back_frame->num = frame->num - num_ignore_frames; back_frame->rel_pc = frame->rel_pc; back_frame->pc = frame->pc; diff --git a/libbacktrace/backtrace_test.cpp b/libbacktrace/backtrace_test.cpp index e5eb9e34e..c3e5da09b 100644 --- a/libbacktrace/backtrace_test.cpp +++ b/libbacktrace/backtrace_test.cpp @@ -1844,6 +1844,22 @@ TEST(libbacktrace, unwind_remote_through_signal_using_action_new) { UnwindThroughSignal(true, Backtrace::CreateNew, BacktraceMap::CreateNew); } +static void TestFrameSkipNumbering(create_func_t create_func, map_create_func_t map_create_func) { + std::unique_ptr map(map_create_func(getpid(), false)); + std::unique_ptr backtrace(create_func(getpid(), gettid(), map.get())); + backtrace->Unwind(1); + ASSERT_NE(0U, backtrace->NumFrames()); + ASSERT_EQ(0U, backtrace->GetFrame(0)->num); +} + +TEST(libbacktrace, unwind_frame_skip_numbering) { + TestFrameSkipNumbering(Backtrace::Create, BacktraceMap::Create); +} + +TEST(libbacktrace, unwind_frame_skip_numbering_new) { + TestFrameSkipNumbering(Backtrace::CreateNew, BacktraceMap::CreateNew); +} + #if defined(ENABLE_PSS_TESTS) #include "GetPss.h"