diff options
Diffstat (limited to 'libbacktrace')
-rw-r--r-- | libbacktrace/Backtrace.cpp | 5 | ||||
-rw-r--r-- | libbacktrace/backtrace_test.cpp | 9 |
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 { |