Loading libbacktrace/Backtrace.cpp +16 −6 Original line number Diff line number Diff line Loading @@ -93,16 +93,26 @@ std::string Backtrace::FormatFrameData(size_t frame_num) { } std::string Backtrace::FormatFrameData(const backtrace_frame_data_t* frame) { const char* map_name; if (BacktraceMap::IsValid(frame->map) && !frame->map.name.empty()) { uintptr_t relative_pc; std::string map_name; if (BacktraceMap::IsValid(frame->map)) { relative_pc = BacktraceMap::GetRelativePc(frame->map, frame->pc); if (!frame->map.name.empty()) { map_name = frame->map.name.c_str(); if (map_name[0] == '[' && map_name[map_name.size() - 1] == ']') { map_name.resize(map_name.size() - 1); map_name += StringPrintf(":%" PRIPTR "]", frame->map.start); } } else { map_name = StringPrintf("<anonymous:%" PRIPTR ">", frame->map.start); } } else { map_name = "<unknown>"; 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)); std::string line(StringPrintf("#%02zu pc %" PRIPTR " ", frame->num, relative_pc)); line += map_name; // Special handling for non-zero offset maps, we need to print that // information. if (frame->map.offset != 0) { Loading libbacktrace/backtrace_test.cpp +17 −4 Original line number Diff line number Diff line Loading @@ -775,16 +775,29 @@ TEST(libbacktrace, format_test) { backtrace->FormatFrameData(&frame)); // Check map name empty, but exists. frame.map.start = 1; frame.map.end = 1; frame.pc = 0xb0020; frame.map.start = 0xb0000; frame.map.end = 0xbffff; frame.map.load_base = 0; #if defined(__LP64__) EXPECT_EQ("#01 pc 0000000000000001 <unknown>", EXPECT_EQ("#01 pc 0000000000000020 <anonymous:00000000000b0000>", #else EXPECT_EQ("#01 pc 00000001 <unknown>", EXPECT_EQ("#01 pc 00000020 <anonymous:000b0000>", #endif backtrace->FormatFrameData(&frame)); // Check map name begins with a [. frame.pc = 0xc0020; frame.map.start = 0xc0000; frame.map.end = 0xcffff; frame.map.load_base = 0; frame.map.name = "[anon:thread signal stack]"; #if defined(__LP64__) EXPECT_EQ("#01 pc 0000000000000020 [anon:thread signal stack:00000000000c0000]", #else EXPECT_EQ("#01 pc 00000020 [anon:thread signal stack:000c0000]", #endif backtrace->FormatFrameData(&frame)); // Check relative pc is set and map name is set. frame.pc = 0x12345679; Loading Loading
libbacktrace/Backtrace.cpp +16 −6 Original line number Diff line number Diff line Loading @@ -93,16 +93,26 @@ std::string Backtrace::FormatFrameData(size_t frame_num) { } std::string Backtrace::FormatFrameData(const backtrace_frame_data_t* frame) { const char* map_name; if (BacktraceMap::IsValid(frame->map) && !frame->map.name.empty()) { uintptr_t relative_pc; std::string map_name; if (BacktraceMap::IsValid(frame->map)) { relative_pc = BacktraceMap::GetRelativePc(frame->map, frame->pc); if (!frame->map.name.empty()) { map_name = frame->map.name.c_str(); if (map_name[0] == '[' && map_name[map_name.size() - 1] == ']') { map_name.resize(map_name.size() - 1); map_name += StringPrintf(":%" PRIPTR "]", frame->map.start); } } else { map_name = StringPrintf("<anonymous:%" PRIPTR ">", frame->map.start); } } else { map_name = "<unknown>"; 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)); std::string line(StringPrintf("#%02zu pc %" PRIPTR " ", frame->num, relative_pc)); line += map_name; // Special handling for non-zero offset maps, we need to print that // information. if (frame->map.offset != 0) { Loading
libbacktrace/backtrace_test.cpp +17 −4 Original line number Diff line number Diff line Loading @@ -775,16 +775,29 @@ TEST(libbacktrace, format_test) { backtrace->FormatFrameData(&frame)); // Check map name empty, but exists. frame.map.start = 1; frame.map.end = 1; frame.pc = 0xb0020; frame.map.start = 0xb0000; frame.map.end = 0xbffff; frame.map.load_base = 0; #if defined(__LP64__) EXPECT_EQ("#01 pc 0000000000000001 <unknown>", EXPECT_EQ("#01 pc 0000000000000020 <anonymous:00000000000b0000>", #else EXPECT_EQ("#01 pc 00000001 <unknown>", EXPECT_EQ("#01 pc 00000020 <anonymous:000b0000>", #endif backtrace->FormatFrameData(&frame)); // Check map name begins with a [. frame.pc = 0xc0020; frame.map.start = 0xc0000; frame.map.end = 0xcffff; frame.map.load_base = 0; frame.map.name = "[anon:thread signal stack]"; #if defined(__LP64__) EXPECT_EQ("#01 pc 0000000000000020 [anon:thread signal stack:00000000000c0000]", #else EXPECT_EQ("#01 pc 00000020 [anon:thread signal stack:000c0000]", #endif backtrace->FormatFrameData(&frame)); // Check relative pc is set and map name is set. frame.pc = 0x12345679; Loading