Loading libunwindstack/Unwinder.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -247,7 +247,7 @@ void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip, // or the pc in the first frame is in a valid map. // This allows for a case where the code jumps into the middle of // nowhere, but there is no other unwind information after that. if (frames_.size() != 2 || maps_->Find(frames_[0].pc) != nullptr) { if (frames_.size() > 2 || (frames_.size() > 0 && maps_->Find(frames_[0].pc) != nullptr)) { // Remove the speculative frame. frames_.pop_back(); } Loading libunwindstack/tests/UnwinderTest.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -749,6 +749,23 @@ TEST_F(UnwinderTest, speculative_frame_not_removed_pc_bad) { EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); } // Verify that a speculative frame does not cause a crash when it wasn't // really added due to a filter. TEST_F(UnwinderTest, speculative_frame_check_with_no_frames) { regs_.set_pc(0x23000); regs_.set_sp(0x10000); regs_.FakeSetReturnAddress(0x23100); regs_.FakeSetReturnAddressValid(true); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); std::vector<std::string> skip_names{"libanother.so"}; unwinder.Unwind(&skip_names); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); ASSERT_EQ(0U, unwinder.NumFrames()); } // Verify that an unwind stops when a frame is in given suffix. TEST_F(UnwinderTest, map_ignore_suffixes) { ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); Loading Loading
libunwindstack/Unwinder.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -247,7 +247,7 @@ void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip, // or the pc in the first frame is in a valid map. // This allows for a case where the code jumps into the middle of // nowhere, but there is no other unwind information after that. if (frames_.size() != 2 || maps_->Find(frames_[0].pc) != nullptr) { if (frames_.size() > 2 || (frames_.size() > 0 && maps_->Find(frames_[0].pc) != nullptr)) { // Remove the speculative frame. frames_.pop_back(); } Loading
libunwindstack/tests/UnwinderTest.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -749,6 +749,23 @@ TEST_F(UnwinderTest, speculative_frame_not_removed_pc_bad) { EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); } // Verify that a speculative frame does not cause a crash when it wasn't // really added due to a filter. TEST_F(UnwinderTest, speculative_frame_check_with_no_frames) { regs_.set_pc(0x23000); regs_.set_sp(0x10000); regs_.FakeSetReturnAddress(0x23100); regs_.FakeSetReturnAddressValid(true); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); std::vector<std::string> skip_names{"libanother.so"}; unwinder.Unwind(&skip_names); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); ASSERT_EQ(0U, unwinder.NumFrames()); } // Verify that an unwind stops when a frame is in given suffix. TEST_F(UnwinderTest, map_ignore_suffixes) { ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); Loading