Merge "Cleanup the libbacktrace interface a bit." am: e3d470b81d am: 011f61f39d

am: 8c632cb59a

Change-Id: I8724717bc0fe798337a36ec9f1f07405207f3a2a
This commit is contained in:
Christopher Ferris 2017-07-20 04:08:49 +00:00 committed by android-build-merger
commit 718760c145
10 changed files with 109 additions and 101 deletions

View file

@ -220,21 +220,21 @@ TEST_F(TombstoneTest, multiple_maps) {
map.start = 0xa434000;
map.end = 0xa435000;
map.offset = 0x1000;
map.load_base = 0xd000;
map.load_bias = 0xd000;
map.flags = PROT_WRITE;
map_mock_->AddMap(map);
map.start = 0xa534000;
map.end = 0xa535000;
map.offset = 0x3000;
map.load_base = 0x2000;
map.load_bias = 0x2000;
map.flags = PROT_EXEC;
map_mock_->AddMap(map);
map.start = 0xa634000;
map.end = 0xa635000;
map.offset = 0;
map.load_base = 0;
map.load_bias = 0;
map.flags = PROT_READ | PROT_WRITE | PROT_EXEC;
map.name = "/system/lib/fake.so";
map_mock_->AddMap(map);
@ -244,20 +244,20 @@ TEST_F(TombstoneTest, multiple_maps) {
std::string tombstone_contents;
ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
const char* expected_dump = \
"\nmemory map:\n"
const char* expected_dump =
"\nmemory map:\n"
#if defined(__LP64__)
" 00000000'0a234000-00000000'0a234fff --- 0 1000\n"
" 00000000'0a334000-00000000'0a334fff r-- f000 1000\n"
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load base 0xd000)\n"
" 00000000'0a534000-00000000'0a534fff --x 3000 1000 (load base 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n";
" 00000000'0a234000-00000000'0a234fff --- 0 1000\n"
" 00000000'0a334000-00000000'0a334fff r-- f000 1000\n"
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load bias 0xd000)\n"
" 00000000'0a534000-00000000'0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n";
#else
" 0a234000-0a234fff --- 0 1000\n"
" 0a334000-0a334fff r-- f000 1000\n"
" 0a434000-0a434fff -w- 1000 1000 (load base 0xd000)\n"
" 0a534000-0a534fff --x 3000 1000 (load base 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n";
" 0a234000-0a234fff --- 0 1000\n"
" 0a334000-0a334fff r-- f000 1000\n"
" 0a434000-0a434fff -w- 1000 1000 (load bias 0xd000)\n"
" 0a534000-0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n";
#endif
ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
@ -274,21 +274,21 @@ TEST_F(TombstoneTest, multiple_maps_fault_address_before) {
map.start = 0xa434000;
map.end = 0xa435000;
map.offset = 0x1000;
map.load_base = 0xd000;
map.load_bias = 0xd000;
map.flags = PROT_WRITE;
map_mock_->AddMap(map);
map.start = 0xa534000;
map.end = 0xa535000;
map.offset = 0x3000;
map.load_base = 0x2000;
map.load_bias = 0x2000;
map.flags = PROT_EXEC;
map_mock_->AddMap(map);
map.start = 0xa634000;
map.end = 0xa635000;
map.offset = 0;
map.load_base = 0;
map.load_bias = 0;
map.flags = PROT_READ | PROT_WRITE | PROT_EXEC;
map.name = "/system/lib/fake.so";
map_mock_->AddMap(map);
@ -304,18 +304,18 @@ TEST_F(TombstoneTest, multiple_maps_fault_address_before) {
std::string tombstone_contents;
ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
const char* expected_dump = \
"\nmemory map: (fault address prefixed with --->)\n"
const char* expected_dump =
"\nmemory map: (fault address prefixed with --->)\n"
#if defined(__LP64__)
"--->Fault address falls at 00000000'00001000 before any mapped regions\n"
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load base 0xd000)\n"
" 00000000'0a534000-00000000'0a534fff --x 3000 1000 (load base 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n";
"--->Fault address falls at 00000000'00001000 before any mapped regions\n"
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load bias 0xd000)\n"
" 00000000'0a534000-00000000'0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n";
#else
"--->Fault address falls at 00001000 before any mapped regions\n"
" 0a434000-0a434fff -w- 1000 1000 (load base 0xd000)\n"
" 0a534000-0a534fff --x 3000 1000 (load base 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n";
"--->Fault address falls at 00001000 before any mapped regions\n"
" 0a434000-0a434fff -w- 1000 1000 (load bias 0xd000)\n"
" 0a534000-0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n";
#endif
ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
@ -332,21 +332,21 @@ TEST_F(TombstoneTest, multiple_maps_fault_address_between) {
map.start = 0xa434000;
map.end = 0xa435000;
map.offset = 0x1000;
map.load_base = 0xd000;
map.load_bias = 0xd000;
map.flags = PROT_WRITE;
map_mock_->AddMap(map);
map.start = 0xa534000;
map.end = 0xa535000;
map.offset = 0x3000;
map.load_base = 0x2000;
map.load_bias = 0x2000;
map.flags = PROT_EXEC;
map_mock_->AddMap(map);
map.start = 0xa634000;
map.end = 0xa635000;
map.offset = 0;
map.load_base = 0;
map.load_bias = 0;
map.flags = PROT_READ | PROT_WRITE | PROT_EXEC;
map.name = "/system/lib/fake.so";
map_mock_->AddMap(map);
@ -362,18 +362,18 @@ TEST_F(TombstoneTest, multiple_maps_fault_address_between) {
std::string tombstone_contents;
ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
const char* expected_dump = \
"\nmemory map: (fault address prefixed with --->)\n"
const char* expected_dump =
"\nmemory map: (fault address prefixed with --->)\n"
#if defined(__LP64__)
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load base 0xd000)\n"
"--->Fault address falls at 00000000'0a533000 between mapped regions\n"
" 00000000'0a534000-00000000'0a534fff --x 3000 1000 (load base 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n";
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load bias 0xd000)\n"
"--->Fault address falls at 00000000'0a533000 between mapped regions\n"
" 00000000'0a534000-00000000'0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n";
#else
" 0a434000-0a434fff -w- 1000 1000 (load base 0xd000)\n"
"--->Fault address falls at 0a533000 between mapped regions\n"
" 0a534000-0a534fff --x 3000 1000 (load base 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n";
" 0a434000-0a434fff -w- 1000 1000 (load bias 0xd000)\n"
"--->Fault address falls at 0a533000 between mapped regions\n"
" 0a534000-0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n";
#endif
ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
@ -390,21 +390,21 @@ TEST_F(TombstoneTest, multiple_maps_fault_address_in_map) {
map.start = 0xa434000;
map.end = 0xa435000;
map.offset = 0x1000;
map.load_base = 0xd000;
map.load_bias = 0xd000;
map.flags = PROT_WRITE;
map_mock_->AddMap(map);
map.start = 0xa534000;
map.end = 0xa535000;
map.offset = 0x3000;
map.load_base = 0x2000;
map.load_bias = 0x2000;
map.flags = PROT_EXEC;
map_mock_->AddMap(map);
map.start = 0xa634000;
map.end = 0xa635000;
map.offset = 0;
map.load_base = 0;
map.load_bias = 0;
map.flags = PROT_READ | PROT_WRITE | PROT_EXEC;
map.name = "/system/lib/fake.so";
map_mock_->AddMap(map);
@ -420,16 +420,16 @@ TEST_F(TombstoneTest, multiple_maps_fault_address_in_map) {
std::string tombstone_contents;
ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
const char* expected_dump = \
"\nmemory map: (fault address prefixed with --->)\n"
const char* expected_dump =
"\nmemory map: (fault address prefixed with --->)\n"
#if defined(__LP64__)
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load base 0xd000)\n"
"--->00000000'0a534000-00000000'0a534fff --x 3000 1000 (load base 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n";
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load bias 0xd000)\n"
"--->00000000'0a534000-00000000'0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n";
#else
" 0a434000-0a434fff -w- 1000 1000 (load base 0xd000)\n"
"--->0a534000-0a534fff --x 3000 1000 (load base 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n";
" 0a434000-0a434fff -w- 1000 1000 (load bias 0xd000)\n"
"--->0a534000-0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n";
#endif
ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
@ -446,21 +446,21 @@ TEST_F(TombstoneTest, multiple_maps_fault_address_after) {
map.start = 0xa434000;
map.end = 0xa435000;
map.offset = 0x1000;
map.load_base = 0xd000;
map.load_bias = 0xd000;
map.flags = PROT_WRITE;
map_mock_->AddMap(map);
map.start = 0xa534000;
map.end = 0xa535000;
map.offset = 0x3000;
map.load_base = 0x2000;
map.load_bias = 0x2000;
map.flags = PROT_EXEC;
map_mock_->AddMap(map);
map.start = 0xa634000;
map.end = 0xa635000;
map.offset = 0;
map.load_base = 0;
map.load_bias = 0;
map.flags = PROT_READ | PROT_WRITE | PROT_EXEC;
map.name = "/system/lib/fake.so";
map_mock_->AddMap(map);
@ -480,18 +480,18 @@ TEST_F(TombstoneTest, multiple_maps_fault_address_after) {
std::string tombstone_contents;
ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
const char* expected_dump = \
"\nmemory map: (fault address prefixed with --->)\n"
const char* expected_dump =
"\nmemory map: (fault address prefixed with --->)\n"
#if defined(__LP64__)
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load base 0xd000)\n"
" 00000000'0a534000-00000000'0a534fff --x 3000 1000 (load base 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n"
"--->Fault address falls at 00001234'5a534040 after any mapped regions\n";
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load bias 0xd000)\n"
" 00000000'0a534000-00000000'0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 00000000'0a634000-00000000'0a634fff rwx 0 1000 /system/lib/fake.so\n"
"--->Fault address falls at 00001234'5a534040 after any mapped regions\n";
#else
" 0a434000-0a434fff -w- 1000 1000 (load base 0xd000)\n"
" 0a534000-0a534fff --x 3000 1000 (load base 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n"
"--->Fault address falls at 0f534040 after any mapped regions\n";
" 0a434000-0a434fff -w- 1000 1000 (load bias 0xd000)\n"
" 0a534000-0a534fff --x 3000 1000 (load bias 0x2000)\n"
" 0a634000-0a634fff rwx 0 1000 /system/lib/fake.so\n"
"--->Fault address falls at 0f534040 after any mapped regions\n";
#endif
ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
@ -508,7 +508,7 @@ TEST_F(TombstoneTest, multiple_maps_getsiginfo_fail) {
map.start = 0xa434000;
map.end = 0xa435000;
map.offset = 0x1000;
map.load_base = 0xd000;
map.load_bias = 0xd000;
map.flags = PROT_WRITE;
map_mock_->AddMap(map);
@ -520,12 +520,12 @@ TEST_F(TombstoneTest, multiple_maps_getsiginfo_fail) {
std::string tombstone_contents;
ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
const char* expected_dump = \
"\nmemory map:\n"
const char* expected_dump =
"\nmemory map:\n"
#if defined(__LP64__)
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load base 0xd000)\n";
" 00000000'0a434000-00000000'0a434fff -w- 1000 1000 (load bias 0xd000)\n";
#else
" 0a434000-0a434fff -w- 1000 1000 (load base 0xd000)\n";
" 0a434000-0a434fff -w- 1000 1000 (load bias 0xd000)\n";
#endif
ASSERT_STREQ(expected_dump, tombstone_contents.c_str());

View file

@ -466,11 +466,11 @@ static void dump_all_maps(Backtrace* backtrace, BacktraceMap* map, log_t* log, p
line += " (BuildId: " + build_id + ")";
}
}
if (it->load_base != 0) {
if (it->load_bias != 0) {
if (space_needed) {
line += ' ';
}
line += StringPrintf(" (load base 0x%" PRIxPTR ")", it->load_base);
line += StringPrintf(" (load bias 0x%" PRIxPTR ")", it->load_bias);
}
_LOG(log, logtype::MAPS, "%s\n", line.c_str());
}

View file

@ -84,10 +84,8 @@ std::string Backtrace::FormatFrameData(size_t frame_num) {
}
std::string Backtrace::FormatFrameData(const backtrace_frame_data_t* frame) {
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] == ']') {
@ -99,10 +97,9 @@ std::string Backtrace::FormatFrameData(const backtrace_frame_data_t* frame) {
}
} else {
map_name = "<unknown>";
relative_pc = frame->pc;
}
std::string line(StringPrintf("#%02zu pc %" PRIPTR " ", frame->num, relative_pc));
std::string line(StringPrintf("#%02zu pc %" PRIPTR " ", frame->num, frame->rel_pc));
line += map_name;
// Special handling for non-zero offset maps, we need to print that
// information.

View file

@ -133,6 +133,11 @@ bool UnwindCurrent::UnwindFromContext(size_t num_ignore_frames, ucontext_t* ucon
backtrace_frame_data_t* prev = &frames_.at(num_frames-1);
prev->stack_size = frame->sp - prev->sp;
}
if (BacktraceMap::IsValid(frame->map)) {
frame->rel_pc = frame->pc - frame->map.start + frame->map.load_bias;
} else {
frame->rel_pc = frame->pc;
}
num_frames++;
} else {
num_ignore_frames--;

View file

@ -57,7 +57,7 @@ bool UnwindMapRemote::GenerateMap() {
map.start = unw_map.start;
map.end = unw_map.end;
map.offset = unw_map.offset;
map.load_base = unw_map.load_base;
map.load_bias = unw_map.load_base;
map.flags = unw_map.flags;
map.name = unw_map.path;
@ -106,7 +106,7 @@ bool UnwindMapLocal::GenerateMap() {
map.start = unw_map.start;
map.end = unw_map.end;
map.offset = unw_map.offset;
map.load_base = unw_map.load_base;
map.load_bias = unw_map.load_base;
map.flags = unw_map.flags;
map.name = unw_map.path;

View file

@ -135,6 +135,11 @@ bool UnwindPtrace::Unwind(size_t num_ignore_frames, ucontext_t* ucontext) {
}
FillInMap(frame->pc, &frame->map);
if (BacktraceMap::IsValid(frame->map)) {
frame->rel_pc = frame->pc - frame->map.start + frame->map.load_bias;
} else {
frame->rel_pc = frame->pc;
}
frame->func_name = GetFunctionName(frame->pc, &frame->func_offset, &frame->map);

View file

@ -167,9 +167,9 @@ TEST(libbacktrace, DISABLED_generate_offline_testdata) {
// 2. Dump maps
for (auto it = map->begin(); it != map->end(); ++it) {
testdata += android::base::StringPrintf(
"map: start: %" PRIxPTR " end: %" PRIxPTR " offset: %" PRIxPTR
" load_base: %" PRIxPTR " flags: %d name: %s\n",
it->start, it->end, it->offset, it->load_base, it->flags, it->name.c_str());
"map: start: %" PRIxPTR " end: %" PRIxPTR " offset: %" PRIxPTR " load_bias: %" PRIxPTR
" flags: %d name: %s\n",
it->start, it->end, it->offset, it->load_bias, it->flags, it->name.c_str());
}
// 3. Dump registers
testdata += android::base::StringPrintf("registers: %zu ", sizeof(arg.unw_context));
@ -246,9 +246,9 @@ bool ReadOfflineTestData(const std::string offline_testdata_path, OfflineTestDat
backtrace_map_t& map = testdata->maps.back();
int pos;
sscanf(line.c_str(),
"map: start: %" SCNxPTR " end: %" SCNxPTR " offset: %" SCNxPTR
" load_base: %" SCNxPTR " flags: %d name: %n",
&map.start, &map.end, &map.offset, &map.load_base, &map.flags, &pos);
"map: start: %" SCNxPTR " end: %" SCNxPTR " offset: %" SCNxPTR " load_bias: %" SCNxPTR
" flags: %d name: %n",
&map.start, &map.end, &map.offset, &map.load_bias, &map.flags, &pos);
map.name = android::base::Trim(line.substr(pos));
} else if (android::base::StartsWith(line, "registers:")) {
size_t size;
@ -392,8 +392,8 @@ TEST(libbacktrace, offline_unwind_mix_eh_frame_and_arm_exidx) {
// The last frame is outside of libart.so
ASSERT_EQ(testdata.symbols.size() + 1, backtrace->NumFrames());
for (size_t i = 0; i + 1 < backtrace->NumFrames(); ++i) {
uintptr_t vaddr_in_file = backtrace->GetFrame(i)->pc - testdata.maps[0].start +
testdata.maps[0].load_base;
uintptr_t vaddr_in_file =
backtrace->GetFrame(i)->pc - testdata.maps[0].start + testdata.maps[0].load_bias;
std::string name = FunctionNameForAddress(vaddr_in_file, testdata.symbols);
ASSERT_EQ(name, testdata.symbols[i].name);
}

View file

@ -784,6 +784,7 @@ TEST(libbacktrace, format_test) {
backtrace_frame_data_t frame;
frame.num = 1;
frame.pc = 2;
frame.rel_pc = 2;
frame.sp = 0;
frame.stack_size = 0;
frame.func_offset = 0;
@ -799,9 +800,10 @@ TEST(libbacktrace, format_test) {
// Check map name empty, but exists.
frame.pc = 0xb0020;
frame.rel_pc = 0x20;
frame.map.start = 0xb0000;
frame.map.end = 0xbffff;
frame.map.load_base = 0;
frame.map.load_bias = 0;
#if defined(__LP64__)
EXPECT_EQ("#01 pc 0000000000000020 <anonymous:00000000000b0000>",
#else
@ -813,7 +815,7 @@ TEST(libbacktrace, format_test) {
frame.pc = 0xc0020;
frame.map.start = 0xc0000;
frame.map.end = 0xcffff;
frame.map.load_base = 0;
frame.map.load_bias = 0;
frame.map.name = "[anon:thread signal stack]";
#if defined(__LP64__)
EXPECT_EQ("#01 pc 0000000000000020 [anon:thread signal stack:00000000000c0000]",
@ -824,6 +826,7 @@ TEST(libbacktrace, format_test) {
// Check relative pc is set and map name is set.
frame.pc = 0x12345679;
frame.rel_pc = 0x12345678;
frame.map.name = "MapFake";
frame.map.start = 1;
frame.map.end = 1;
@ -852,9 +855,10 @@ TEST(libbacktrace, format_test) {
#endif
backtrace->FormatFrameData(&frame));
// Check func_name is set, func offset is non-zero, and load_base is non-zero.
// Check func_name is set, func offset is non-zero, and load_bias is non-zero.
frame.rel_pc = 0x123456dc;
frame.func_offset = 645;
frame.map.load_base = 100;
frame.map.load_bias = 100;
#if defined(__LP64__)
EXPECT_EQ("#01 pc 00000000123456dc MapFake (ProcFake+645)",
#else
@ -1737,9 +1741,13 @@ static void UnwindThroughSignal(bool use_action) {
FinishRemoteProcess(pid);
}
TEST(libbacktrace, unwind_remote_through_signal_using_handler) { UnwindThroughSignal(false); }
TEST(libbacktrace, unwind_remote_through_signal_using_handler) {
UnwindThroughSignal(false);
}
TEST(libbacktrace, unwind_remote_through_signal_using_action) { UnwindThroughSignal(true); }
TEST(libbacktrace, unwind_remote_through_signal_using_action) {
UnwindThroughSignal(true);
}
#if defined(ENABLE_PSS_TESTS)
#include "GetPss.h"

View file

@ -55,6 +55,7 @@ enum BacktraceUnwindError : uint32_t {
struct backtrace_frame_data_t {
size_t num; // The current fame number.
uintptr_t pc; // The absolute pc.
uintptr_t rel_pc; // The relative pc.
uintptr_t sp; // The top of the stack.
size_t stack_size; // The size of the stack, zero indicate an unknown stack size.
backtrace_map_t map; // The map associated with the given pc.

View file

@ -41,7 +41,7 @@ struct backtrace_map_t {
uintptr_t start = 0;
uintptr_t end = 0;
uintptr_t offset = 0;
uintptr_t load_base = 0;
uintptr_t load_bias = 0;
int flags = 0;
std::string name;
};
@ -95,14 +95,6 @@ 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);