Add offset to backtrace_string printing.
The libmemunreachable code uses backtrace_string to print out the backtrace information. However, when the offset of the map that a frame is in is non-zero, no information is printed. This means that when a frame comes from a shared library loaded from an apk, it's impossible to tell which shared library the frame is really coming from. Add the offset display when it's non-zero. This means this can now be fed to development/scripts/stack to decode the frame. Bug: 37276041 Test: Ran dumpsys meminfo --unreachable on an app that leaks from a Test: shared library and verified the offset output is present. Change-Id: I61d34ae3f617622d354cc099eff520a64782b6e2
This commit is contained in:
parent
a559cff654
commit
c0352bbd5f
1 changed files with 12 additions and 3 deletions
|
@ -153,18 +153,27 @@ std::string backtrace_string(const uintptr_t* frames, size_t frame_count) {
|
|||
if (soname == nullptr) {
|
||||
soname = "<unknown>";
|
||||
}
|
||||
|
||||
char offset_buf[128];
|
||||
if (entry != nullptr && entry->offset != 0) {
|
||||
snprintf(offset_buf, sizeof(offset_buf), " (offset 0x%" PRIxPTR ")", entry->offset);
|
||||
} else {
|
||||
offset_buf[0] = '\0';
|
||||
}
|
||||
|
||||
char buf[1024];
|
||||
if (symbol != nullptr) {
|
||||
char* demangled_symbol = __cxa_demangle(symbol, nullptr, nullptr, nullptr);
|
||||
const char* best_name = (demangled_symbol != nullptr) ? demangled_symbol : symbol;
|
||||
|
||||
async_safe_format_buffer(
|
||||
buf, sizeof(buf), " #%02zd pc %" PAD_PTR " %s (%s+%" PRIuPTR ")\n", frame_num,
|
||||
rel_pc, soname, best_name, frames[frame_num] - offset);
|
||||
buf, sizeof(buf), " #%02zd pc %" PAD_PTR " %s%s (%s+%" PRIuPTR ")\n", frame_num,
|
||||
rel_pc, soname, offset_buf, best_name, frames[frame_num] - offset);
|
||||
free(demangled_symbol);
|
||||
} else {
|
||||
async_safe_format_buffer(
|
||||
buf, sizeof(buf), " #%02zd pc %" PAD_PTR " %s\n", frame_num, rel_pc, soname);
|
||||
buf, sizeof(buf), " #%02zd pc %" PAD_PTR " %s%s\n", frame_num, rel_pc, soname,
|
||||
offset_buf);
|
||||
}
|
||||
str += buf;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue