diff options
author | Christopher Ferris <cferris@google.com> | 2015-05-02 00:07:16 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-05-02 00:07:20 +0000 |
commit | 5cffd971997ace97ebfd2ecb7d43a64c03cf3169 (patch) | |
tree | 4cd8c69137d0efc780a783803106d53b8fbd1337 | |
parent | 95108f18443f22440653bf1648c969816ca852dd (diff) | |
parent | 329ed7dae49eba09bdf865dd999d1a7e73bb9687 (diff) | |
download | system_core-5cffd971997ace97ebfd2ecb7d43a64c03cf3169.zip system_core-5cffd971997ace97ebfd2ecb7d43a64c03cf3169.tar.gz system_core-5cffd971997ace97ebfd2ecb7d43a64c03cf3169.tar.bz2 |
Merge "Add load base to map for relocation packing." into mnc-dev
-rw-r--r-- | debuggerd/tombstone.cpp | 3 | ||||
-rw-r--r-- | include/backtrace/BacktraceMap.h | 9 | ||||
-rw-r--r-- | libbacktrace/Backtrace.cpp | 7 | ||||
-rw-r--r-- | libbacktrace/UnwindMap.cpp | 2 | ||||
-rw-r--r-- | libbacktrace/backtrace_test.cpp | 11 |
5 files changed, 26 insertions, 6 deletions
diff --git a/debuggerd/tombstone.cpp b/debuggerd/tombstone.cpp index 094ab48..81da16d 100644 --- a/debuggerd/tombstone.cpp +++ b/debuggerd/tombstone.cpp @@ -379,6 +379,9 @@ static void dump_all_maps(Backtrace* backtrace, BacktraceMap* map, log_t* log, p line += " (BuildId: " + build_id + ")"; } } + if (it->load_base != 0) { + line += android::base::StringPrintf(" (load base 0x%" PRIxPTR ")", it->load_base); + } _LOG(log, logtype::MAPS, "%s\n", line.c_str()); } if (print_fault_address_marker) { diff --git a/include/backtrace/BacktraceMap.h b/include/backtrace/BacktraceMap.h index da96307..731c248 100644 --- a/include/backtrace/BacktraceMap.h +++ b/include/backtrace/BacktraceMap.h @@ -37,6 +37,7 @@ struct backtrace_map_t { uintptr_t start; uintptr_t end; + uintptr_t load_base; int flags; std::string name; }; @@ -82,6 +83,14 @@ public: return map.end > 0; } + static uintptr_t GetRelativePc(const backtrace_map_t& map, uintptr_t pc) { + if (IsValid(map)) { + return pc - map.start + map.load_base; + } else { + return pc; + } + } + protected: BacktraceMap(pid_t pid); diff --git a/libbacktrace/Backtrace.cpp b/libbacktrace/Backtrace.cpp index 91ca8b7..d75c210 100644 --- a/libbacktrace/Backtrace.cpp +++ b/libbacktrace/Backtrace.cpp @@ -97,12 +97,7 @@ std::string Backtrace::FormatFrameData(const backtrace_frame_data_t* frame) { map_name = "<unknown>"; } - uintptr_t relative_pc; - if (BacktraceMap::IsValid(frame->map)) { - relative_pc = frame->pc - frame->map.start; - } else { - relative_pc = frame->pc; - } + uintptr_t relative_pc = BacktraceMap::GetRelativePc(frame->map, frame->pc); std::string line(StringPrintf("#%02zu pc %" PRIPTR " %s", frame->num, relative_pc, map_name)); if (!frame->func_name.empty()) { diff --git a/libbacktrace/UnwindMap.cpp b/libbacktrace/UnwindMap.cpp index fa59d07..4a4e2f3 100644 --- a/libbacktrace/UnwindMap.cpp +++ b/libbacktrace/UnwindMap.cpp @@ -51,6 +51,7 @@ bool UnwindMap::GenerateMap() { map.start = unw_map.start; map.end = unw_map.end; + map.load_base = unw_map.load_base; map.flags = unw_map.flags; map.name = unw_map.path; @@ -91,6 +92,7 @@ bool UnwindMapLocal::GenerateMap() { map.start = unw_map.start; map.end = unw_map.end; + map.load_base = unw_map.load_base; map.flags = unw_map.flags; map.name = unw_map.path; diff --git a/libbacktrace/backtrace_test.cpp b/libbacktrace/backtrace_test.cpp index 4af6592..ebcb1f8 100644 --- a/libbacktrace/backtrace_test.cpp +++ b/libbacktrace/backtrace_test.cpp @@ -771,6 +771,7 @@ TEST(libbacktrace, format_test) { // Check map name empty, but exists. frame.map.start = 1; frame.map.end = 1; + frame.map.load_base = 0; #if defined(__LP64__) EXPECT_EQ("#01 pc 0000000000000001 <unknown>", #else @@ -808,6 +809,16 @@ TEST(libbacktrace, format_test) { EXPECT_EQ("#01 pc 12345678 MapFake (ProcFake+645)", #endif backtrace->FormatFrameData(&frame)); + + // Check func_name is set, func offset is non-zero, and load_base is non-zero. + frame.func_offset = 645; + frame.map.load_base = 100; +#if defined(__LP64__) + EXPECT_EQ("#01 pc 00000000123456dc MapFake (ProcFake+645)", +#else + EXPECT_EQ("#01 pc 123456dc MapFake (ProcFake+645)", +#endif + backtrace->FormatFrameData(&frame)); } struct map_test_t { |