Loading libbacktrace/UnwindStackMap.cpp +6 −7 Original line number Diff line number Diff line Loading @@ -149,13 +149,12 @@ bool UnwindStackOfflineMap::CreateProcessMemory(const backtrace_stackinfo_t& sta } // Create the process memory from the stack data. uint64_t size = stack.end - stack.start; unwindstack::MemoryBuffer* memory = new unwindstack::MemoryBuffer; memory->Resize(size); memcpy(memory->GetPtr(0), stack.data, size); std::shared_ptr<unwindstack::Memory> shared_memory(memory); process_memory_.reset(new unwindstack::MemoryRange(shared_memory, 0, size, stack.start)); if (memory_ == nullptr) { memory_ = new unwindstack::MemoryOfflineBuffer(stack.data, stack.start, stack.end); process_memory_.reset(memory_); } else { memory_->Reset(stack.data, stack.start, stack.end); } return true; } Loading libbacktrace/UnwindStackMap.h +3 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,9 @@ class UnwindStackOfflineMap : public UnwindStackMap { bool Build(const std::vector<backtrace_map_t>& maps); bool CreateProcessMemory(const backtrace_stackinfo_t& stack); private: unwindstack::MemoryOfflineBuffer* memory_ = nullptr; }; #endif // _LIBBACKTRACE_UNWINDSTACK_MAP_H libunwindstack/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -155,6 +155,7 @@ cc_test { "tests/MemoryFake.cpp", "tests/MemoryFileTest.cpp", "tests/MemoryLocalTest.cpp", "tests/MemoryOfflineBufferTest.cpp", "tests/MemoryOfflineTest.cpp", "tests/MemoryRangeTest.cpp", "tests/MemoryRemoteTest.cpp", Loading libunwindstack/Memory.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -345,6 +345,25 @@ size_t MemoryOffline::Read(uint64_t addr, void* dst, size_t size) { return memory_->Read(addr, dst, size); } MemoryOfflineBuffer::MemoryOfflineBuffer(const uint8_t* data, uint64_t start, uint64_t end) : data_(data), start_(start), end_(end) {} void MemoryOfflineBuffer::Reset(const uint8_t* data, uint64_t start, uint64_t end) { data_ = data; start_ = start; end_ = end; } size_t MemoryOfflineBuffer::Read(uint64_t addr, void* dst, size_t size) { if (addr < start_ || addr >= end_) { return 0; } size_t read_length = std::min(size, static_cast<size_t>(end_ - addr)); memcpy(dst, &data_[addr - start_], read_length); return read_length; } MemoryOfflineParts::~MemoryOfflineParts() { for (auto memory : memories_) { delete memory; Loading libunwindstack/include/unwindstack/Memory.h +15 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,21 @@ class MemoryOffline : public Memory { std::unique_ptr<MemoryRange> memory_; }; class MemoryOfflineBuffer : public Memory { public: MemoryOfflineBuffer(const uint8_t* data, uint64_t start, uint64_t end); virtual ~MemoryOfflineBuffer() = default; void Reset(const uint8_t* data, uint64_t start, uint64_t end); size_t Read(uint64_t addr, void* dst, size_t size) override; private: const uint8_t* data_; uint64_t start_; uint64_t end_; }; class MemoryOfflineParts : public Memory { public: MemoryOfflineParts() = default; Loading Loading
libbacktrace/UnwindStackMap.cpp +6 −7 Original line number Diff line number Diff line Loading @@ -149,13 +149,12 @@ bool UnwindStackOfflineMap::CreateProcessMemory(const backtrace_stackinfo_t& sta } // Create the process memory from the stack data. uint64_t size = stack.end - stack.start; unwindstack::MemoryBuffer* memory = new unwindstack::MemoryBuffer; memory->Resize(size); memcpy(memory->GetPtr(0), stack.data, size); std::shared_ptr<unwindstack::Memory> shared_memory(memory); process_memory_.reset(new unwindstack::MemoryRange(shared_memory, 0, size, stack.start)); if (memory_ == nullptr) { memory_ = new unwindstack::MemoryOfflineBuffer(stack.data, stack.start, stack.end); process_memory_.reset(memory_); } else { memory_->Reset(stack.data, stack.start, stack.end); } return true; } Loading
libbacktrace/UnwindStackMap.h +3 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,9 @@ class UnwindStackOfflineMap : public UnwindStackMap { bool Build(const std::vector<backtrace_map_t>& maps); bool CreateProcessMemory(const backtrace_stackinfo_t& stack); private: unwindstack::MemoryOfflineBuffer* memory_ = nullptr; }; #endif // _LIBBACKTRACE_UNWINDSTACK_MAP_H
libunwindstack/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -155,6 +155,7 @@ cc_test { "tests/MemoryFake.cpp", "tests/MemoryFileTest.cpp", "tests/MemoryLocalTest.cpp", "tests/MemoryOfflineBufferTest.cpp", "tests/MemoryOfflineTest.cpp", "tests/MemoryRangeTest.cpp", "tests/MemoryRemoteTest.cpp", Loading
libunwindstack/Memory.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -345,6 +345,25 @@ size_t MemoryOffline::Read(uint64_t addr, void* dst, size_t size) { return memory_->Read(addr, dst, size); } MemoryOfflineBuffer::MemoryOfflineBuffer(const uint8_t* data, uint64_t start, uint64_t end) : data_(data), start_(start), end_(end) {} void MemoryOfflineBuffer::Reset(const uint8_t* data, uint64_t start, uint64_t end) { data_ = data; start_ = start; end_ = end; } size_t MemoryOfflineBuffer::Read(uint64_t addr, void* dst, size_t size) { if (addr < start_ || addr >= end_) { return 0; } size_t read_length = std::min(size, static_cast<size_t>(end_ - addr)); memcpy(dst, &data_[addr - start_], read_length); return read_length; } MemoryOfflineParts::~MemoryOfflineParts() { for (auto memory : memories_) { delete memory; Loading
libunwindstack/include/unwindstack/Memory.h +15 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,21 @@ class MemoryOffline : public Memory { std::unique_ptr<MemoryRange> memory_; }; class MemoryOfflineBuffer : public Memory { public: MemoryOfflineBuffer(const uint8_t* data, uint64_t start, uint64_t end); virtual ~MemoryOfflineBuffer() = default; void Reset(const uint8_t* data, uint64_t start, uint64_t end); size_t Read(uint64_t addr, void* dst, size_t size) override; private: const uint8_t* data_; uint64_t start_; uint64_t end_; }; class MemoryOfflineParts : public Memory { public: MemoryOfflineParts() = default; Loading