From e7b6624c3fd6bb780f6330448fad175e80469384 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Fri, 15 Dec 2017 11:17:45 -0800 Subject: [PATCH] Fix issues in libunwindstack. - Add a load_bias field in MapInfo so that it can be loaded offline, and also so it can be cached. - Add an Add function to the Maps class so that it's possible to manually create a map. - Remove the OfflineMaps class since I haven't found a reason for this to exist. - Add a pointer to the gnu debugdata compressed section in the interface itself and modify the step path to try eh_frame, then debug_frame, then gnu_debugdata. This way arm can add exidx as the last step behind gnu_debugdata. Add an offline test to verify the order of unwind. - Fix x86_64_ucontext_t since it was a different size on 32 bit and 64 bit systems. Test: Pass new unit tests. Change-Id: I978b70d6c244bd307c62a29886d24c1a8cb2af23 --- libunwindstack/Android.bp | 1 + libunwindstack/Elf.cpp | 11 +-- libunwindstack/ElfInterface.cpp | 19 +++++- libunwindstack/ElfInterfaceArm.cpp | 16 +++-- libunwindstack/ElfInterfaceArm.h | 6 +- libunwindstack/MapInfo.cpp | 14 +++- libunwindstack/Maps.cpp | 64 ++---------------- libunwindstack/UcontextX86_64.h | 1 + .../include/unwindstack/ElfInterface.h | 7 +- libunwindstack/include/unwindstack/MapInfo.h | 10 ++- libunwindstack/include/unwindstack/Maps.h | 11 +-- libunwindstack/tests/ElfFake.cpp | 2 +- libunwindstack/tests/ElfFake.h | 3 +- libunwindstack/tests/ElfInterfaceArmTest.cpp | 24 ++++--- libunwindstack/tests/ElfTest.cpp | 6 +- .../tests/MapInfoGetLoadBiasTest.cpp | 20 ++++++ libunwindstack/tests/MapsTest.cpp | 18 +++++ libunwindstack/tests/UnwindOfflineTest.cpp | 48 +++++++++++++ .../gnu_debugdata_arm32/libandroid_runtime.so | Bin 0 -> 1421884 bytes .../offline/gnu_debugdata_arm32/maps.txt | 1 + .../offline/gnu_debugdata_arm32/regs.txt | 2 + .../offline/gnu_debugdata_arm32/stack.data | Bin 0 -> 24 bytes libunwindstack/tools/unwind_info.cpp | 2 +- 23 files changed, 183 insertions(+), 103 deletions(-) create mode 100644 libunwindstack/tests/files/offline/gnu_debugdata_arm32/libandroid_runtime.so create mode 100644 libunwindstack/tests/files/offline/gnu_debugdata_arm32/maps.txt create mode 100644 libunwindstack/tests/files/offline/gnu_debugdata_arm32/regs.txt create mode 100644 libunwindstack/tests/files/offline/gnu_debugdata_arm32/stack.data diff --git a/libunwindstack/Android.bp b/libunwindstack/Android.bp index 21dd306e7..5e9438870 100644 --- a/libunwindstack/Android.bp +++ b/libunwindstack/Android.bp @@ -167,6 +167,7 @@ cc_test { data: [ "tests/files/elf32.xz", "tests/files/elf64.xz", + "tests/files/offline/gnu_debugdata_arm32/*", "tests/files/offline/straddle_arm32/*", "tests/files/offline/straddle_arm64/*", ], diff --git a/libunwindstack/Elf.cpp b/libunwindstack/Elf.cpp index f486e2314..5ec4a3d2e 100644 --- a/libunwindstack/Elf.cpp +++ b/libunwindstack/Elf.cpp @@ -79,6 +79,7 @@ void Elf::InitGnuDebugdata() { uint64_t load_bias; if (gnu->Init(&load_bias)) { gnu->InitHeaders(); + interface_->SetGnuDebugdataInterface(gnu); } else { // Free all of the memory associated with the gnu_debugdata section. gnu_debugdata_memory_.reset(nullptr); @@ -115,17 +116,9 @@ bool Elf::Step(uint64_t rel_pc, uint64_t adjusted_rel_pc, uint64_t elf_offset, R return true; } - // Adjust the load bias to get the real relative pc. - if (adjusted_rel_pc < load_bias_) { - return false; - } - adjusted_rel_pc -= load_bias_; - // Lock during the step which can update information in the object. std::lock_guard guard(lock_); - return interface_->Step(adjusted_rel_pc, regs, process_memory, finished) || - (gnu_debugdata_interface_ && - gnu_debugdata_interface_->Step(adjusted_rel_pc, regs, process_memory, finished)); + return interface_->Step(adjusted_rel_pc, load_bias_, regs, process_memory, finished); } bool Elf::IsValidElf(Memory* memory) { diff --git a/libunwindstack/ElfInterface.cpp b/libunwindstack/ElfInterface.cpp index 334cf76f6..df1642e18 100644 --- a/libunwindstack/ElfInterface.cpp +++ b/libunwindstack/ElfInterface.cpp @@ -386,16 +386,29 @@ bool ElfInterface::GetFunctionNameWithTemplate(uint64_t addr, uint64_t load_bias return false; } -bool ElfInterface::Step(uint64_t pc, Regs* regs, Memory* process_memory, bool* finished) { +bool ElfInterface::Step(uint64_t pc, uint64_t load_bias, Regs* regs, Memory* process_memory, + bool* finished) { + // Adjust the load bias to get the real relative pc. + if (pc < load_bias) { + return false; + } + uint64_t adjusted_pc = pc - load_bias; + // Try the eh_frame first. DwarfSection* eh_frame = eh_frame_.get(); - if (eh_frame != nullptr && eh_frame->Step(pc, regs, process_memory, finished)) { + if (eh_frame != nullptr && eh_frame->Step(adjusted_pc, regs, process_memory, finished)) { return true; } // Try the debug_frame next. DwarfSection* debug_frame = debug_frame_.get(); - if (debug_frame != nullptr && debug_frame->Step(pc, regs, process_memory, finished)) { + if (debug_frame != nullptr && debug_frame->Step(adjusted_pc, regs, process_memory, finished)) { + return true; + } + + // Finally try the gnu_debugdata interface, but always use a zero load bias. + if (gnu_debugdata_interface_ != nullptr && + gnu_debugdata_interface_->Step(pc, 0, regs, process_memory, finished)) { return true; } return false; diff --git a/libunwindstack/ElfInterfaceArm.cpp b/libunwindstack/ElfInterfaceArm.cpp index 9841e2474..5d99bd791 100644 --- a/libunwindstack/ElfInterfaceArm.cpp +++ b/libunwindstack/ElfInterfaceArm.cpp @@ -92,16 +92,24 @@ bool ElfInterfaceArm::HandleType(uint64_t offset, uint32_t type, uint64_t load_b return true; } -bool ElfInterfaceArm::Step(uint64_t pc, Regs* regs, Memory* process_memory, bool* finished) { +bool ElfInterfaceArm::Step(uint64_t pc, uint64_t load_bias, Regs* regs, Memory* process_memory, + bool* finished) { // Dwarf unwind information is precise about whether a pc is covered or not, // but arm unwind information only has ranges of pc. In order to avoid // incorrectly doing a bad unwind using arm unwind information for a // different function, always try and unwind with the dwarf information first. - return ElfInterface32::Step(pc, regs, process_memory, finished) || - StepExidx(pc, regs, process_memory, finished); + return ElfInterface32::Step(pc, load_bias, regs, process_memory, finished) || + StepExidx(pc, load_bias, regs, process_memory, finished); } -bool ElfInterfaceArm::StepExidx(uint64_t pc, Regs* regs, Memory* process_memory, bool* finished) { +bool ElfInterfaceArm::StepExidx(uint64_t pc, uint64_t load_bias, Regs* regs, Memory* process_memory, + bool* finished) { + // Adjust the load bias to get the real relative pc. + if (pc < load_bias) { + return false; + } + pc -= load_bias; + RegsArm* regs_arm = reinterpret_cast(regs); uint64_t entry_offset; if (!FindEntry(pc, &entry_offset)) { diff --git a/libunwindstack/ElfInterfaceArm.h b/libunwindstack/ElfInterfaceArm.h index eeb2e1770..9c067ba3a 100644 --- a/libunwindstack/ElfInterfaceArm.h +++ b/libunwindstack/ElfInterfaceArm.h @@ -70,9 +70,11 @@ class ElfInterfaceArm : public ElfInterface32 { bool HandleType(uint64_t offset, uint32_t type, uint64_t load_bias) override; - bool Step(uint64_t pc, Regs* regs, Memory* process_memory, bool* finished) override; + bool Step(uint64_t pc, uint64_t load_bias, Regs* regs, Memory* process_memory, + bool* finished) override; - bool StepExidx(uint64_t pc, Regs* regs, Memory* process_memory, bool* finished); + bool StepExidx(uint64_t pc, uint64_t load_bias, Regs* regs, Memory* process_memory, + bool* finished); uint64_t start_offset() { return start_offset_; } diff --git a/libunwindstack/MapInfo.cpp b/libunwindstack/MapInfo.cpp index 51bce8eea..89fe038dc 100644 --- a/libunwindstack/MapInfo.cpp +++ b/libunwindstack/MapInfo.cpp @@ -122,13 +122,21 @@ Elf* MapInfo::GetElf(const std::shared_ptr& process_memory, bool init_gn } uint64_t MapInfo::GetLoadBias(const std::shared_ptr& process_memory) { + uint64_t cur_load_bias = load_bias.load(); + if (cur_load_bias != static_cast(-1)) { + return cur_load_bias; + } + { // Make sure no other thread is trying to add the elf to this map. std::lock_guard guard(mutex_); if (elf != nullptr) { if (elf->valid()) { - return elf->GetLoadBias(); + cur_load_bias = elf->GetLoadBias(); + load_bias = cur_load_bias; + return cur_load_bias; } else { + load_bias = 0; return 0; } } @@ -137,7 +145,9 @@ uint64_t MapInfo::GetLoadBias(const std::shared_ptr& process_memory) { // Call lightweight static function that will only read enough of the // elf data to get the load bias. std::unique_ptr memory(CreateMemory(process_memory)); - return Elf::GetLoadBias(memory.get()); + cur_load_bias = Elf::GetLoadBias(memory.get()); + load_bias = cur_load_bias; + return cur_load_bias; } } // namespace unwindstack diff --git a/libunwindstack/Maps.cpp b/libunwindstack/Maps.cpp index 56370c196..4c1621284 100644 --- a/libunwindstack/Maps.cpp +++ b/libunwindstack/Maps.cpp @@ -202,6 +202,13 @@ bool Maps::Parse() { return return_value; } +void Maps::Add(uint64_t start, uint64_t end, uint64_t offset, uint64_t flags, + const std::string& name, uint64_t load_bias) { + MapInfo* map_info = new MapInfo(start, end, offset, flags, name); + map_info->load_bias = load_bias; + maps_.push_back(map_info); +} + Maps::~Maps() { for (auto& map : maps_) { delete map; @@ -235,61 +242,4 @@ const std::string RemoteMaps::GetMapsFile() const { return "/proc/" + std::to_string(pid_) + "/maps"; } -bool OfflineMaps::Parse() { - // Format of maps information: - // StartOffset - // EndOffset - // offset - // flags - // MapNameLength - // MapName - android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(file_.c_str(), O_RDONLY))); - if (fd == -1) { - return false; - } - - std::vector name; - while (true) { - uint64_t start; - ssize_t bytes = TEMP_FAILURE_RETRY(read(fd, &start, sizeof(start))); - if (bytes == 0) { - break; - } - if (bytes == -1 || bytes != sizeof(start)) { - return false; - } - uint64_t end; - bytes = TEMP_FAILURE_RETRY(read(fd, &end, sizeof(end))); - if (bytes == -1 || bytes != sizeof(end)) { - return false; - } - uint64_t offset; - bytes = TEMP_FAILURE_RETRY(read(fd, &offset, sizeof(offset))); - if (bytes == -1 || bytes != sizeof(offset)) { - return false; - } - uint16_t flags; - bytes = TEMP_FAILURE_RETRY(read(fd, &flags, sizeof(flags))); - if (bytes == -1 || bytes != sizeof(flags)) { - return false; - } - uint16_t len; - bytes = TEMP_FAILURE_RETRY(read(fd, &len, sizeof(len))); - if (bytes == -1 || bytes != sizeof(len)) { - return false; - } - if (len > 0) { - name.resize(len); - bytes = TEMP_FAILURE_RETRY(read(fd, name.data(), len)); - if (bytes == -1 || bytes != len) { - return false; - } - maps_.push_back(new MapInfo(start, end, offset, flags, std::string(name.data(), len))); - } else { - maps_.push_back(new MapInfo(start, end, offset, flags, "")); - } - } - return true; -} - } // namespace unwindstack diff --git a/libunwindstack/UcontextX86_64.h b/libunwindstack/UcontextX86_64.h index d689796bf..2b8bdc4f0 100644 --- a/libunwindstack/UcontextX86_64.h +++ b/libunwindstack/UcontextX86_64.h @@ -38,6 +38,7 @@ namespace unwindstack { struct x86_64_stack_t { uint64_t ss_sp; // void __user* int32_t ss_flags; // int + int32_t pad; uint64_t ss_size; // size_t }; diff --git a/libunwindstack/include/unwindstack/ElfInterface.h b/libunwindstack/include/unwindstack/ElfInterface.h index 5cfe74dae..5d3cd5ebd 100644 --- a/libunwindstack/include/unwindstack/ElfInterface.h +++ b/libunwindstack/include/unwindstack/ElfInterface.h @@ -60,7 +60,8 @@ class ElfInterface { virtual bool GetFunctionName(uint64_t addr, uint64_t load_bias, std::string* name, uint64_t* offset) = 0; - virtual bool Step(uint64_t rel_pc, Regs* regs, Memory* process_memory, bool* finished); + virtual bool Step(uint64_t rel_pc, uint64_t load_bias, Regs* regs, Memory* process_memory, + bool* finished); Memory* CreateGnuDebugdataMemory(); @@ -68,6 +69,8 @@ class ElfInterface { const std::unordered_map& pt_loads() { return pt_loads_; } + void SetGnuDebugdataInterface(ElfInterface* interface) { gnu_debugdata_interface_ = interface; } + uint64_t dynamic_offset() { return dynamic_offset_; } uint64_t dynamic_size() { return dynamic_size_; } uint64_t eh_frame_hdr_offset() { return eh_frame_hdr_offset_; } @@ -134,6 +137,8 @@ class ElfInterface { std::unique_ptr eh_frame_; std::unique_ptr debug_frame_; + // The Elf object owns the gnu_debugdata interface object. + ElfInterface* gnu_debugdata_interface_ = nullptr; std::vector symbols_; }; diff --git a/libunwindstack/include/unwindstack/MapInfo.h b/libunwindstack/include/unwindstack/MapInfo.h index 6f8ceca51..22e48f71c 100644 --- a/libunwindstack/include/unwindstack/MapInfo.h +++ b/libunwindstack/include/unwindstack/MapInfo.h @@ -19,6 +19,7 @@ #include +#include #include #include @@ -33,7 +34,12 @@ struct MapInfo { MapInfo() = default; MapInfo(uint64_t start, uint64_t end) : start(start), end(end) {} MapInfo(uint64_t start, uint64_t end, uint64_t offset, uint64_t flags, const std::string& name) - : start(start), end(end), offset(offset), flags(flags), name(name) {} + : start(start), + end(end), + offset(offset), + flags(flags), + name(name), + load_bias(static_cast(-1)) {} ~MapInfo() { delete elf; } uint64_t start = 0; @@ -48,6 +54,8 @@ struct MapInfo { // instead of a portion of the file. uint64_t elf_offset = 0; + std::atomic_uint64_t load_bias; + // This function guarantees it will never return nullptr. Elf* GetElf(const std::shared_ptr& process_memory, bool init_gnu_debugdata = false); diff --git a/libunwindstack/include/unwindstack/Maps.h b/libunwindstack/include/unwindstack/Maps.h index 34fef7fac..17a2d28ae 100644 --- a/libunwindstack/include/unwindstack/Maps.h +++ b/libunwindstack/include/unwindstack/Maps.h @@ -42,6 +42,9 @@ class Maps { virtual const std::string GetMapsFile() const { return ""; } + void Add(uint64_t start, uint64_t end, uint64_t offset, uint64_t flags, const std::string& name, + uint64_t load_bias); + typedef std::vector::iterator iterator; iterator begin() { return maps_.begin(); } iterator end() { return maps_.end(); } @@ -100,14 +103,6 @@ class FileMaps : public Maps { const std::string file_; }; -class OfflineMaps : public FileMaps { - public: - OfflineMaps(const std::string& file) : FileMaps(file) {} - virtual ~OfflineMaps() = default; - - bool Parse() override; -}; - } // namespace unwindstack #endif // _LIBUNWINDSTACK_MAPS_H diff --git a/libunwindstack/tests/ElfFake.cpp b/libunwindstack/tests/ElfFake.cpp index b94a8a41d..68de797f5 100644 --- a/libunwindstack/tests/ElfFake.cpp +++ b/libunwindstack/tests/ElfFake.cpp @@ -43,7 +43,7 @@ bool ElfInterfaceFake::GetFunctionName(uint64_t, uint64_t, std::string* name, ui return true; } -bool ElfInterfaceFake::Step(uint64_t, Regs* regs, Memory*, bool* finished) { +bool ElfInterfaceFake::Step(uint64_t, uint64_t, Regs* regs, Memory*, bool* finished) { if (steps_.empty()) { return false; } diff --git a/libunwindstack/tests/ElfFake.h b/libunwindstack/tests/ElfFake.h index 565b13f1d..abf992759 100644 --- a/libunwindstack/tests/ElfFake.h +++ b/libunwindstack/tests/ElfFake.h @@ -68,8 +68,7 @@ class ElfInterfaceFake : public ElfInterface { bool GetFunctionName(uint64_t, uint64_t, std::string*, uint64_t*) override; - bool Step(uint64_t, Regs*, Memory*, bool*) override; - + bool Step(uint64_t, uint64_t, Regs*, Memory*, bool*) override; static void FakePushFunctionData(const FunctionData data) { functions_.push_back(data); } static void FakePushStepData(const StepData data) { steps_.push_back(data); } diff --git a/libunwindstack/tests/ElfInterfaceArmTest.cpp b/libunwindstack/tests/ElfInterfaceArmTest.cpp index 5f7cf6097..e6763ab01 100644 --- a/libunwindstack/tests/ElfInterfaceArmTest.cpp +++ b/libunwindstack/tests/ElfInterfaceArmTest.cpp @@ -302,7 +302,7 @@ TEST_F(ElfInterfaceArmTest, StepExidx) { // FindEntry fails. bool finished; - ASSERT_FALSE(interface.StepExidx(0x7000, nullptr, nullptr, &finished)); + ASSERT_FALSE(interface.StepExidx(0x7000, 0, nullptr, nullptr, &finished)); // ExtractEntry should fail. interface.FakeSetStartOffset(0x1000); @@ -315,20 +315,26 @@ TEST_F(ElfInterfaceArmTest, StepExidx) { regs[ARM_REG_LR] = 0x20000; regs.set_sp(regs[ARM_REG_SP]); regs.set_pc(0x1234); - ASSERT_FALSE(interface.StepExidx(0x7000, ®s, &process_memory_, &finished)); + ASSERT_FALSE(interface.StepExidx(0x7000, 0, ®s, &process_memory_, &finished)); // Eval should fail. memory_.SetData32(0x1004, 0x81000000); - ASSERT_FALSE(interface.StepExidx(0x7000, ®s, &process_memory_, &finished)); + ASSERT_FALSE(interface.StepExidx(0x7000, 0, ®s, &process_memory_, &finished)); // Everything should pass. memory_.SetData32(0x1004, 0x80b0b0b0); - ASSERT_TRUE(interface.StepExidx(0x7000, ®s, &process_memory_, &finished)); + ASSERT_TRUE(interface.StepExidx(0x7000, 0, ®s, &process_memory_, &finished)); ASSERT_FALSE(finished); ASSERT_EQ(0x1000U, regs.sp()); ASSERT_EQ(0x1000U, regs[ARM_REG_SP]); ASSERT_EQ(0x20000U, regs.pc()); ASSERT_EQ(0x20000U, regs[ARM_REG_PC]); + + // Load bias is non-zero. + ASSERT_TRUE(interface.StepExidx(0x8000, 0x1000, ®s, &process_memory_, &finished)); + + // Pc too small. + ASSERT_FALSE(interface.StepExidx(0x8000, 0x9000, ®s, &process_memory_, &finished)); } TEST_F(ElfInterfaceArmTest, StepExidx_pc_set) { @@ -349,7 +355,7 @@ TEST_F(ElfInterfaceArmTest, StepExidx_pc_set) { // Everything should pass. bool finished; - ASSERT_TRUE(interface.StepExidx(0x7000, ®s, &process_memory_, &finished)); + ASSERT_TRUE(interface.StepExidx(0x7000, 0, ®s, &process_memory_, &finished)); ASSERT_FALSE(finished); ASSERT_EQ(0x10004U, regs.sp()); ASSERT_EQ(0x10004U, regs[ARM_REG_SP]); @@ -372,7 +378,7 @@ TEST_F(ElfInterfaceArmTest, StepExidx_cant_unwind) { regs.set_pc(0x1234); bool finished; - ASSERT_TRUE(interface.StepExidx(0x7000, ®s, &process_memory_, &finished)); + ASSERT_TRUE(interface.StepExidx(0x7000, 0, ®s, &process_memory_, &finished)); ASSERT_TRUE(finished); ASSERT_EQ(0x10000U, regs.sp()); ASSERT_EQ(0x10000U, regs[ARM_REG_SP]); @@ -394,7 +400,7 @@ TEST_F(ElfInterfaceArmTest, StepExidx_refuse_unwind) { regs.set_pc(0x1234); bool finished; - ASSERT_TRUE(interface.StepExidx(0x7000, ®s, &process_memory_, &finished)); + ASSERT_TRUE(interface.StepExidx(0x7000, 0, ®s, &process_memory_, &finished)); ASSERT_TRUE(finished); ASSERT_EQ(0x10000U, regs.sp()); ASSERT_EQ(0x10000U, regs[ARM_REG_SP]); @@ -420,7 +426,7 @@ TEST_F(ElfInterfaceArmTest, StepExidx_pc_zero) { regs.set_pc(0x1234); bool finished; - ASSERT_TRUE(interface.StepExidx(0x7000, ®s, &process_memory_, &finished)); + ASSERT_TRUE(interface.StepExidx(0x7000, 0, ®s, &process_memory_, &finished)); ASSERT_TRUE(finished); ASSERT_EQ(0U, regs.pc()); @@ -432,7 +438,7 @@ TEST_F(ElfInterfaceArmTest, StepExidx_pc_zero) { regs.set_sp(regs[ARM_REG_SP]); regs.set_pc(0x1234); - ASSERT_TRUE(interface.StepExidx(0x7000, ®s, &process_memory_, &finished)); + ASSERT_TRUE(interface.StepExidx(0x7000, 0, ®s, &process_memory_, &finished)); ASSERT_TRUE(finished); ASSERT_EQ(0U, regs.pc()); } diff --git a/libunwindstack/tests/ElfTest.cpp b/libunwindstack/tests/ElfTest.cpp index 7491d4004..5e808ef56 100644 --- a/libunwindstack/tests/ElfTest.cpp +++ b/libunwindstack/tests/ElfTest.cpp @@ -346,7 +346,7 @@ class ElfInterfaceMock : public ElfInterface { void InitHeaders() override {} bool GetSoname(std::string*) override { return false; } bool GetFunctionName(uint64_t, uint64_t, std::string*, uint64_t*) override { return false; } - MOCK_METHOD4(Step, bool(uint64_t, Regs*, Memory*, bool*)); + MOCK_METHOD5(Step, bool(uint64_t, uint64_t, Regs*, Memory*, bool*)); }; TEST_F(ElfTest, step_in_interface) { @@ -361,7 +361,7 @@ TEST_F(ElfTest, step_in_interface) { MemoryFake process_memory; bool finished; - EXPECT_CALL(*interface, Step(0x1000, ®s, &process_memory, &finished)) + EXPECT_CALL(*interface, Step(0x1000, 0, ®s, &process_memory, &finished)) .WillOnce(::testing::Return(true)); ASSERT_TRUE(elf.Step(0x1004, 0x1000, 0x2000, ®s, &process_memory, &finished)); @@ -382,7 +382,7 @@ TEST_F(ElfTest, step_in_interface_non_zero_load_bias) { bool finished; ASSERT_FALSE(elf.Step(0x1004, 0x1000, 0x2000, ®s, &process_memory, &finished)); - EXPECT_CALL(*interface, Step(0x3300, ®s, &process_memory, &finished)) + EXPECT_CALL(*interface, Step(0x7300, 0x4000, ®s, &process_memory, &finished)) .WillOnce(::testing::Return(true)); ASSERT_TRUE(elf.Step(0x7304, 0x7300, 0x2000, ®s, &process_memory, &finished)); diff --git a/libunwindstack/tests/MapInfoGetLoadBiasTest.cpp b/libunwindstack/tests/MapInfoGetLoadBiasTest.cpp index 44a73a8f6..631036b87 100644 --- a/libunwindstack/tests/MapInfoGetLoadBiasTest.cpp +++ b/libunwindstack/tests/MapInfoGetLoadBiasTest.cpp @@ -68,12 +68,23 @@ TEST_F(MapInfoGetLoadBiasTest, no_elf_and_no_valid_elf_in_memory) { EXPECT_EQ(0U, info.GetLoadBias(process_memory_)); } +TEST_F(MapInfoGetLoadBiasTest, load_bias_cached_from_elf) { + map_info_->elf = elf_container_.release(); + + elf_->FakeSetLoadBias(0); + EXPECT_EQ(0U, map_info_->GetLoadBias(process_memory_)); + + elf_->FakeSetLoadBias(0x1000); + EXPECT_EQ(0U, map_info_->GetLoadBias(process_memory_)); +} + TEST_F(MapInfoGetLoadBiasTest, elf_exists) { map_info_->elf = elf_container_.release(); elf_->FakeSetLoadBias(0); EXPECT_EQ(0U, map_info_->GetLoadBias(process_memory_)); + map_info_->load_bias = static_cast(-1); elf_->FakeSetLoadBias(0x1000); EXPECT_EQ(0x1000U, map_info_->GetLoadBias(process_memory_)); } @@ -141,6 +152,15 @@ TEST_F(MapInfoGetLoadBiasTest, elf_exists_in_memory) { EXPECT_EQ(0xe000U, map_info_->GetLoadBias(process_memory_)); } +TEST_F(MapInfoGetLoadBiasTest, elf_exists_in_memory_cached) { + InitElfData(memory_, map_info_->start); + + EXPECT_EQ(0xe000U, map_info_->GetLoadBias(process_memory_)); + + memory_->Clear(); + EXPECT_EQ(0xe000U, map_info_->GetLoadBias(process_memory_)); +} + TEST_F(MapInfoGetLoadBiasTest, multiple_thread_elf_exists_in_memory) { InitElfData(memory_, map_info_->start); diff --git a/libunwindstack/tests/MapsTest.cpp b/libunwindstack/tests/MapsTest.cpp index 8dc884f64..9622ba507 100644 --- a/libunwindstack/tests/MapsTest.cpp +++ b/libunwindstack/tests/MapsTest.cpp @@ -44,6 +44,24 @@ static void VerifyLine(std::string line, MapInfo* info) { } } +TEST(MapsTest, map_add) { + Maps maps; + + maps.Add(0x1000, 0x2000, 0, PROT_READ, "fake_map", 0); + maps.Add(0x3000, 0x4000, 0x10, 0, "", 0x1234); + maps.Add(0x5000, 0x6000, 1, 2, "fake_map2", static_cast(-1)); + + ASSERT_EQ(3U, maps.Total()); + MapInfo* info = maps.Get(0); + ASSERT_EQ(0x1000U, info->start); + ASSERT_EQ(0x2000U, info->end); + ASSERT_EQ(0U, info->offset); + ASSERT_EQ(PROT_READ, info->flags); + ASSERT_EQ("fake_map", info->name); + ASSERT_EQ(0U, info->elf_offset); + ASSERT_EQ(0U, info->load_bias.load()); +} + TEST(MapsTest, verify_parse_line) { MapInfo info; diff --git a/libunwindstack/tests/UnwindOfflineTest.cpp b/libunwindstack/tests/UnwindOfflineTest.cpp index 962f74455..8f2803690 100644 --- a/libunwindstack/tests/UnwindOfflineTest.cpp +++ b/libunwindstack/tests/UnwindOfflineTest.cpp @@ -96,6 +96,54 @@ TEST(UnwindOfflineTest, pc_straddle_arm32) { frame_info); } +TEST(UnwindOfflineTest, pc_in_gnu_debugdata_arm32) { + std::string dir(TestGetFileDirectory() + "offline/gnu_debugdata_arm32/"); + + MemoryOffline* memory = new MemoryOffline; + ASSERT_TRUE(memory->Init((dir + "stack.data").c_str(), 0)); + + FILE* fp = fopen((dir + "regs.txt").c_str(), "r"); + ASSERT_TRUE(fp != nullptr); + RegsArm regs; + uint64_t reg_value; + ASSERT_EQ(1, fscanf(fp, "pc: %" SCNx64 "\n", ®_value)); + regs[ARM_REG_PC] = reg_value; + ASSERT_EQ(1, fscanf(fp, "sp: %" SCNx64 "\n", ®_value)); + regs[ARM_REG_SP] = reg_value; + regs.SetFromRaw(); + fclose(fp); + + fp = fopen((dir + "maps.txt").c_str(), "r"); + ASSERT_TRUE(fp != nullptr); + // The file is guaranteed to be less than 4096 bytes. + std::vector buffer(4096); + ASSERT_NE(0U, fread(buffer.data(), 1, buffer.size(), fp)); + fclose(fp); + + BufferMaps maps(buffer.data()); + ASSERT_TRUE(maps.Parse()); + + ASSERT_EQ(ARCH_ARM, regs.Arch()); + + std::shared_ptr process_memory(memory); + + char* cwd = getcwd(nullptr, 0); + ASSERT_EQ(0, chdir(dir.c_str())); + Unwinder unwinder(128, &maps, ®s, process_memory); + unwinder.Unwind(); + ASSERT_EQ(0, chdir(cwd)); + free(cwd); + + std::string frame_info(DumpFrames(unwinder)); + ASSERT_EQ(2U, unwinder.NumFrames()) << "Unwind:\n" << frame_info; + EXPECT_EQ( + " #00 pc 0006dc49 libandroid_runtime.so " + "(_ZN7android14AndroidRuntime15javaThreadShellEPv+80)\n" + " #01 pc 0006dce5 libandroid_runtime.so " + "(_ZN7android14AndroidRuntime19javaCreateThreadEtcEPFiPvES1_PKcijPS1_)\n", + frame_info); +} + TEST(UnwindOfflineTest, pc_straddle_arm64) { std::string dir(TestGetFileDirectory() + "offline/straddle_arm64/"); diff --git a/libunwindstack/tests/files/offline/gnu_debugdata_arm32/libandroid_runtime.so b/libunwindstack/tests/files/offline/gnu_debugdata_arm32/libandroid_runtime.so new file mode 100644 index 0000000000000000000000000000000000000000..e4283e63bbf8283273d01f7264d17a4ea08fc5ba GIT binary patch literal 1421884 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%0DGlreQ$SretJ#A9c`wZ>)byA6@W9e7rNj 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Π(V5iTvL( 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

E?B2qQUkrd>NCE9F?Wg$ZmQeuMnzNY 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