diff options
Diffstat (limited to 'libunwindstack/tests/UnwinderTest.cpp')
-rw-r--r-- | libunwindstack/tests/UnwinderTest.cpp | 138 |
1 files changed, 115 insertions, 23 deletions
diff --git a/libunwindstack/tests/UnwinderTest.cpp b/libunwindstack/tests/UnwinderTest.cpp index ef1950ccc9..ddd4b4d1b0 100644 --- a/libunwindstack/tests/UnwinderTest.cpp +++ b/libunwindstack/tests/UnwinderTest.cpp @@ -57,6 +57,9 @@ class UnwinderTest : public ::testing::Test { static void SetUpTestSuite() { maps_.reset(new Maps); + memory_ = new MemoryFake; + process_memory_.reset(memory_); + ElfFake* elf = new ElfFake(new MemoryFake); ElfInterfaceFake* interface_fake = new ElfInterfaceFake(nullptr); interface_fake->FakeSetBuildID("FAKE"); @@ -136,7 +139,19 @@ class UnwinderTest : public ::testing::Test { const auto& info7 = *--maps_->end(); info7->load_bias = 0; - process_memory_.reset(new MemoryFake); + elf = new ElfFake(new MemoryFake); + interface = new ElfInterfaceFake(nullptr); + elf->FakeSetInterface(interface); + interface->FakeSetGlobalVariable("__dex_debug_descriptor", 0x1800); + interface->FakeSetDataOffset(0x1000); + interface->FakeSetDataVaddrStart(0x1000); + interface->FakeSetDataVaddrEnd(0x3000); + AddMapInfo(0xf0000, 0xf1000, 0, PROT_READ | PROT_WRITE | PROT_EXEC, "/fake/global.so", elf); + AddMapInfo(0xf1000, 0xf9000, 0x1000, PROT_READ | PROT_WRITE, "/fake/global.so"); + memory_->SetData32(0xf180c, 0xf3000); + memory_->SetData32(0xf3000, 0xf4000); + memory_->SetData32(0xf3004, 0xf4000); + memory_->SetData32(0xf3008, 0xf5000); } void SetUp() override { @@ -147,11 +162,13 @@ class UnwinderTest : public ::testing::Test { static std::unique_ptr<Maps> maps_; static RegsFake regs_; + static MemoryFake* memory_; static std::shared_ptr<Memory> process_memory_; }; std::unique_ptr<Maps> UnwinderTest::maps_; RegsFake UnwinderTest::regs_(5); +MemoryFake* UnwinderTest::memory_; std::shared_ptr<Memory> UnwinderTest::process_memory_(nullptr); TEST_F(UnwinderTest, multiple_frames) { @@ -161,13 +178,14 @@ TEST_F(UnwinderTest, multiple_frames) { regs_.set_pc(0x1000); regs_.set_sp(0x10000); - ElfInterfaceFake::FakePushStepData(StepData(0x1102, 0x10010, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x1202, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x1104, 0x10010, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x1204, 0x10020, false)); ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(3U, unwinder.NumFrames()); @@ -225,14 +243,15 @@ TEST_F(UnwinderTest, multiple_frames_dont_resolve_names) { regs_.set_pc(0x1000); regs_.set_sp(0x10000); - ElfInterfaceFake::FakePushStepData(StepData(0x1102, 0x10010, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x1202, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x1104, 0x10010, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x1204, 0x10020, false)); ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.SetResolveNames(false); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(3U, unwinder.NumFrames()); @@ -293,6 +312,7 @@ TEST_F(UnwinderTest, non_zero_load_bias) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -323,6 +343,7 @@ TEST_F(UnwinderTest, non_zero_elf_offset) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -353,6 +374,7 @@ TEST_F(UnwinderTest, non_zero_map_offset) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -384,6 +406,7 @@ TEST_F(UnwinderTest, disable_embedded_soname) { unwinder.SetEmbeddedSoname(false); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -421,6 +444,7 @@ TEST_F(UnwinderTest, no_frames_after_finished) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -445,7 +469,7 @@ TEST_F(UnwinderTest, no_frames_after_finished) { TEST_F(UnwinderTest, max_frames) { for (size_t i = 0; i < 30; i++) { ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame" + std::to_string(i), i)); - ElfInterfaceFake::FakePushStepData(StepData(0x1102 + i * 0x100, 0x10010 + i * 0x10, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x1104 + i * 0x100, 0x10010 + i * 0x10, false)); } regs_.set_pc(0x1000); @@ -454,6 +478,7 @@ TEST_F(UnwinderTest, max_frames) { Unwinder unwinder(20, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_MAX_FRAMES_EXCEEDED, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(20U, unwinder.NumFrames()); @@ -484,12 +509,12 @@ TEST_F(UnwinderTest, verify_frames_skipped) { regs_.set_pc(0x20000); regs_.set_sp(0x10000); - ElfInterfaceFake::FakePushStepData(StepData(0x23002, 0x10010, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x23102, 0x10020, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x20002, 0x10030, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x21002, 0x10040, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x23004, 0x10010, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x23104, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x20004, 0x10030, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x21004, 0x10040, false)); ElfInterfaceFake::FakePushStepData(StepData(0x1002, 0x10050, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x21002, 0x10060, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x21004, 0x10060, false)); ElfInterfaceFake::FakePushStepData(StepData(0x23002, 0x10070, false)); ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); @@ -497,6 +522,7 @@ TEST_F(UnwinderTest, verify_frames_skipped) { std::vector<std::string> skip_libs{"libunwind.so", "libanother.so"}; unwinder.Unwind(&skip_libs); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(3U, unwinder.NumFrames()); @@ -553,12 +579,13 @@ TEST_F(UnwinderTest, sp_not_in_map) { regs_.set_pc(0x1000); regs_.set_sp(0x63000); - ElfInterfaceFake::FakePushStepData(StepData(0x21002, 0x50020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x21004, 0x50020, false)); ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(2U, unwinder.NumFrames()); @@ -607,6 +634,7 @@ TEST_F(UnwinderTest, pc_in_device_stops_unwind) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -627,6 +655,7 @@ TEST_F(UnwinderTest, sp_in_device_stops_unwind) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -642,6 +671,7 @@ TEST_F(UnwinderTest, pc_without_map) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_INVALID_MAP, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -670,15 +700,16 @@ TEST_F(UnwinderTest, speculative_frame) { // Fake as if code called a nullptr function. regs_.set_pc(0); regs_.set_sp(0x10000); - regs_.FakeSetReturnAddress(0x1202); + regs_.FakeSetReturnAddress(0x1204); regs_.FakeSetReturnAddressValid(true); - ElfInterfaceFake::FakePushStepData(StepData(0x23102, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x23104, 0x10020, false)); ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(3U, unwinder.NumFrames()); @@ -745,6 +776,7 @@ TEST_F(UnwinderTest, speculative_frame_removed) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_INVALID_MAP, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(2U, unwinder.NumFrames()); @@ -789,12 +821,13 @@ TEST_F(UnwinderTest, speculative_frame_not_removed_pc_bad) { // Fake as if code called a nullptr function. regs_.set_pc(0); regs_.set_sp(0x10000); - regs_.FakeSetReturnAddress(0x1202); + regs_.FakeSetReturnAddress(0x1204); regs_.FakeSetReturnAddressValid(true); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(2U, unwinder.NumFrames()); @@ -843,6 +876,7 @@ TEST_F(UnwinderTest, speculative_frame_check_with_no_frames) { std::vector<std::string> skip_names{"libanother.so"}; unwinder.Unwind(&skip_names); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(0U, unwinder.NumFrames()); @@ -858,14 +892,15 @@ TEST_F(UnwinderTest, map_ignore_suffixes) { // Fake as if code called a nullptr function. regs_.set_pc(0x1000); regs_.set_sp(0x10000); - ElfInterfaceFake::FakePushStepData(StepData(0x43402, 0x10010, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x53502, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x43404, 0x10010, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x53504, 0x10020, false)); ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); std::vector<std::string> suffixes{"oat"}; unwinder.Unwind(nullptr, &suffixes); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(2U, unwinder.NumFrames()); @@ -915,16 +950,17 @@ TEST_F(UnwinderTest, sp_pc_do_not_change) { regs_.set_pc(0x1000); regs_.set_sp(0x10000); - ElfInterfaceFake::FakePushStepData(StepData(0x33402, 0x10010, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x33502, 0x10020, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x33502, 0x10020, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x33502, 0x10020, false)); - ElfInterfaceFake::FakePushStepData(StepData(0x33502, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x33404, 0x10010, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x33504, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x33504, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x33504, 0x10020, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x33504, 0x10020, false)); ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_REPEATED_FRAME, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(3U, unwinder.NumFrames()); @@ -984,6 +1020,7 @@ TEST_F(UnwinderTest, dex_pc_in_map) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(2U, unwinder.NumFrames()); @@ -1028,6 +1065,7 @@ TEST_F(UnwinderTest, dex_pc_in_map_non_zero_offset) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(2U, unwinder.NumFrames()); @@ -1072,6 +1110,54 @@ TEST_F(UnwinderTest, dex_pc_not_in_map) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_DEX_PC_NOT_IN_MAP, unwinder.warnings()); + EXPECT_FALSE(unwinder.elf_from_memory_not_file()); + + ASSERT_EQ(2U, unwinder.NumFrames()); + + auto* frame = &unwinder.frames()[0]; + EXPECT_EQ(0U, frame->num); + EXPECT_EQ(0x50000U, frame->rel_pc); + EXPECT_EQ(0x50000U, frame->pc); + EXPECT_EQ(0x10000U, frame->sp); + EXPECT_EQ("", frame->function_name); + EXPECT_EQ(0U, frame->function_offset); + EXPECT_EQ("", frame->map_name); + EXPECT_EQ(0U, frame->map_elf_start_offset); + EXPECT_EQ(0U, frame->map_exact_offset); + EXPECT_EQ(0U, frame->map_start); + EXPECT_EQ(0U, frame->map_end); + EXPECT_EQ(0U, frame->map_load_bias); + EXPECT_EQ(0, frame->map_flags); + + frame = &unwinder.frames()[1]; + EXPECT_EQ(1U, frame->num); + EXPECT_EQ(0U, frame->rel_pc); + EXPECT_EQ(0x1000U, frame->pc); + EXPECT_EQ(0x10000U, frame->sp); + EXPECT_EQ("Frame0", frame->function_name); + EXPECT_EQ(0U, frame->function_offset); + EXPECT_EQ("/system/fake/libc.so", frame->map_name); + EXPECT_EQ(0U, frame->map_elf_start_offset); + EXPECT_EQ(0U, frame->map_exact_offset); + EXPECT_EQ(0x1000U, frame->map_start); + EXPECT_EQ(0x8000U, frame->map_end); + EXPECT_EQ(0U, frame->map_load_bias); + EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); +} + +TEST_F(UnwinderTest, dex_pc_not_in_map_valid_dex_files) { + ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); + regs_.set_pc(0x1000); + regs_.set_sp(0x10000); + regs_.FakeSetDexPc(0x50000); + + DexFiles dex_files(process_memory_); + Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); + unwinder.SetDexFiles(&dex_files, ARCH_ARM); + unwinder.Unwind(); + EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_DEX_PC_NOT_IN_MAP, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(2U, unwinder.NumFrames()); @@ -1113,12 +1199,13 @@ TEST_F(UnwinderTest, dex_pc_multiple_frames) { regs_.set_pc(0x1000); regs_.set_sp(0x10000); regs_.FakeSetDexPc(0xa3400); - ElfInterfaceFake::FakePushStepData(StepData(0x33402, 0x10010, false)); + ElfInterfaceFake::FakePushStepData(StepData(0x33404, 0x10010, false)); ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(3U, unwinder.NumFrames()); @@ -1178,6 +1265,7 @@ TEST_F(UnwinderTest, dex_pc_max_frames) { Unwinder unwinder(1, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_MAX_FRAMES_EXCEEDED, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -1208,6 +1296,7 @@ TEST_F(UnwinderTest, elf_from_memory_not_file) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_TRUE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -1238,6 +1327,7 @@ TEST_F(UnwinderTest, elf_from_memory_but_no_valid_file_with_bracket) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -1268,6 +1358,7 @@ TEST_F(UnwinderTest, elf_from_memory_but_empty_filename) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); @@ -1298,6 +1389,7 @@ TEST_F(UnwinderTest, elf_from_memory_but_from_memfd) { Unwinder unwinder(64, maps_.get(), ®s_, process_memory_); unwinder.Unwind(); EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); + EXPECT_EQ(WARNING_NONE, unwinder.warnings()); EXPECT_FALSE(unwinder.elf_from_memory_not_file()); ASSERT_EQ(1U, unwinder.NumFrames()); |