summaryrefslogtreecommitdiffstats
path: root/libbacktrace
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2015-08-20 11:16:54 -0700
committerChristopher Ferris <cferris@google.com>2015-08-20 11:16:54 -0700
commite0ab23223a1c3110c9550136b8a119b4c30ec066 (patch)
tree35f9f54b4a483d4ea8a6e3fe702d326a0586e897 /libbacktrace
parent29c1275519ef85fa3f30be351f19dc6e7eedbee9 (diff)
downloadsystem_core-e0ab23223a1c3110c9550136b8a119b4c30ec066.zip
system_core-e0ab23223a1c3110c9550136b8a119b4c30ec066.tar.gz
system_core-e0ab23223a1c3110c9550136b8a119b4c30ec066.tar.bz2
Display the map offset for each frame.
The dlopen of a shared library in an apk results in large map offsets. Unfortunately, the current way that the frame data is printed, it's impossible to tell what the relative pc is relative to. With the addition of the offset, it's possible to figure out what the relative pc actually references. Bug: 23348999 Change-Id: Ia51b669ea3f810158cfd0d71d9ae89bf9a3170d3
Diffstat (limited to 'libbacktrace')
-rw-r--r--libbacktrace/Backtrace.cpp5
-rw-r--r--libbacktrace/backtrace_test.cpp9
2 files changed, 14 insertions, 0 deletions
diff --git a/libbacktrace/Backtrace.cpp b/libbacktrace/Backtrace.cpp
index 128bb04..97f0ef4 100644
--- a/libbacktrace/Backtrace.cpp
+++ b/libbacktrace/Backtrace.cpp
@@ -102,6 +102,11 @@ std::string Backtrace::FormatFrameData(const backtrace_frame_data_t* frame) {
uintptr_t relative_pc = BacktraceMap::GetRelativePc(frame->map, frame->pc);
std::string line(StringPrintf("#%02zu pc %" PRIPTR " %s", frame->num, relative_pc, map_name));
+ // Special handling for non-zero offset maps, we need to print that
+ // information.
+ if (frame->map.offset != 0) {
+ line += " (offset " + StringPrintf("0x%" PRIxPTR, frame->map.offset) + ")";
+ }
if (!frame->func_name.empty()) {
line += " (" + frame->func_name;
if (frame->func_offset) {
diff --git a/libbacktrace/backtrace_test.cpp b/libbacktrace/backtrace_test.cpp
index 760f5cc..c650755 100644
--- a/libbacktrace/backtrace_test.cpp
+++ b/libbacktrace/backtrace_test.cpp
@@ -825,6 +825,15 @@ TEST(libbacktrace, format_test) {
EXPECT_EQ("#01 pc 123456dc MapFake (ProcFake+645)",
#endif
backtrace->FormatFrameData(&frame));
+
+ // Check a non-zero map offset.
+ frame.map.offset = 0x1000;
+#if defined(__LP64__)
+ EXPECT_EQ("#01 pc 00000000123456dc MapFake (offset 0x1000) (ProcFake+645)",
+#else
+ EXPECT_EQ("#01 pc 123456dc MapFake (offset 0x1000) (ProcFake+645)",
+#endif
+ backtrace->FormatFrameData(&frame));
}
struct map_test_t {