summaryrefslogtreecommitdiff
path: root/libbacktrace/UnwindStackMap.cpp
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2017-12-11 17:44:33 -0800
committerChristopher Ferris <cferris@google.com>2018-01-29 10:41:11 -0800
commitc8bec5aa91b20b0173bf6bf5f73f9e6daa40519d (patch)
treecada46a2ee86c8c6c22d563b605a5120caff0426 /libbacktrace/UnwindStackMap.cpp
parent8abe4e2638587957f621450b4e4c3ff7af310b08 (diff)
Use new unwinder for offline in libbacktrace.
libbbacktrace changes: - Completely rewrite the BacktraceOffline class to use the new unwinder. - Modify the test data to save ucontext_t data instead of unw_context data. - Convert the previous tests from unw_context data to ucontext_t data. Bug: 65682279 Test: New unit tests pass in libunwindstack. Test: All offline tests continue to pass. Change-Id: I540345c304b20199d46deeb0349a0638a0f3ab2f
Diffstat (limited to 'libbacktrace/UnwindStackMap.cpp')
-rw-r--r--libbacktrace/UnwindStackMap.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/libbacktrace/UnwindStackMap.cpp b/libbacktrace/UnwindStackMap.cpp
index 11ff84a8b..97f8d782d 100644
--- a/libbacktrace/UnwindStackMap.cpp
+++ b/libbacktrace/UnwindStackMap.cpp
@@ -147,6 +147,43 @@ UnwindDexFile* UnwindStackMap::GetDexFile(uint64_t dex_file_offset, unwindstack:
}
#endif
+UnwindStackOfflineMap::UnwindStackOfflineMap(pid_t pid) : UnwindStackMap(pid) {}
+
+bool UnwindStackOfflineMap::Build() {
+ return false;
+}
+
+bool UnwindStackOfflineMap::Build(const std::vector<backtrace_map_t>& backtrace_maps,
+ const backtrace_stackinfo_t& stack) {
+ if (stack.start >= stack.end) {
+ return false;
+ }
+
+ for (const backtrace_map_t& map : backtrace_maps) {
+ maps_.push_back(map);
+ }
+
+ std::sort(maps_.begin(), maps_.end(),
+ [](const backtrace_map_t& a, const backtrace_map_t& b) { return a.start < b.start; });
+
+ unwindstack::Maps* maps = new unwindstack::Maps;
+ stack_maps_.reset(maps);
+ for (const backtrace_map_t& map : maps_) {
+ maps->Add(map.start, map.end, map.offset, map.flags, map.name, map.load_bias);
+ }
+
+ // 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));
+
+ return true;
+}
+
//-------------------------------------------------------------------------
// BacktraceMap create function.
//-------------------------------------------------------------------------
@@ -167,3 +204,16 @@ BacktraceMap* BacktraceMap::Create(pid_t pid, bool uncached) {
}
return map;
}
+
+//-------------------------------------------------------------------------
+// BacktraceMap create offline function.
+//-------------------------------------------------------------------------
+BacktraceMap* BacktraceMap::CreateOffline(pid_t pid, const std::vector<backtrace_map_t>& maps,
+ const backtrace_stackinfo_t& stack) {
+ UnwindStackOfflineMap* map = new UnwindStackOfflineMap(pid);
+ if (!map->Build(maps, stack)) {
+ delete map;
+ return nullptr;
+ }
+ return map;
+}