diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 05:23:37 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 05:23:37 +0000 |
commit | 86332a270bc2a7778e69618cb25e6e1999bb2d08 (patch) | |
tree | 29ec4010a4b3176479805bc4c425a7746570d15c | |
parent | fdcc69fd7848504b39861fa903cea3a53c15a142 (diff) | |
parent | a6e85254ece44850c02ba5542d1777e7a7d0e532 (diff) | |
download | libmemunreachable-android14-mainline-uwb-release.tar.gz |
Snap for 10453563 from a6e85254ece44850c02ba5542d1777e7a7d0e532 to mainline-uwb-releaseaml_uwb_341513070aml_uwb_341511050aml_uwb_341310300aml_uwb_341310030aml_uwb_341111010aml_uwb_341011000android14-mainline-uwb-release
Change-Id: I7d06a9870d08843006d6db8ae42c6ea6fbbe6208
-rw-r--r-- | Android.bp | 13 | ||||
-rw-r--r-- | PREUPLOAD.cfg | 5 | ||||
-rw-r--r-- | README.md | 74 | ||||
-rw-r--r-- | ThreadCapture.cpp | 16 |
4 files changed, 99 insertions, 9 deletions
@@ -54,6 +54,13 @@ cc_library { export_include_dirs: ["include"], local_include_dirs: ["include"], version_script: "libmemunreachable.map", + + static: { + apex_available: [ + "//apex_available:platform", + "com.android.runtime", + ], + }, } // Integration test that runs against the public API of libmemunreachable @@ -80,7 +87,11 @@ cc_test { "tests/HeapWalker_test.cpp", "tests/LeakFolding_test.cpp", ], - + tidy_checks: [ + // Ignore memory leaks after ASSERT_NE in DisableMalloc_test.cpp. + "-clang-analyzer-cplusplus.NewDeleteLeaks", + "-clang-analyzer-unix.Malloc", + ], target: { android: { srcs: [ diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg new file mode 100644 index 0000000..c8dbf77 --- /dev/null +++ b/PREUPLOAD.cfg @@ -0,0 +1,5 @@ +[Builtin Hooks] +clang_format = true + +[Builtin Hooks Options] +clang_format = --commit ${PREUPLOAD_COMMIT} --style file --extensions c,h,cc,cpp @@ -33,6 +33,80 @@ adb shell setprop libc.debug.malloc.program "''" adb shell setprop wrap.[process] "''" ``` +Starting with Android U, new malloc debug options have been added +that allow specific sized allocation to be backtraced. The three +new options are: + +- backtrace\_size +- backtrace\_min\_size +- backtrace\_max\_size + +When enabling backtracing on all allocations, it is possible to have +the process run so slowly that the app does not come up. Or the app +runs so slowly that the leaks do not occur. The best way to avoid any +slowdowns or timeouts is to first run libmemunreachable and look at +the sizes of the leaking allocations. If there is only a single +allocation size, then use backtrace\_size which will indicate that +backtraces should only be collected for that exact size. For example, +if the output of dumpsys is: + +``` + Unreachable memory + 24 bytes in 2 unreachable allocations + ABI: 'arm64' + + 24 bytes unreachable at 71d37787d0 + first 20 bytes of contents: + 71d37787d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 71d37787e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + + 24 bytes unreachable at 71d37797d0 + first 20 bytes of contents: + 71d37797d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 71d37797e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +``` + +Then set the malloc debug options thusly: + +``` +adb shell setprop libc.debug.malloc.options "'backtrace backtrace_size=24'" +``` + +This will backtrace only 24 byte allocations. + +If the output of libmemunreachable has multiple sized allocations, set +the backtrace\_min\_size and backtrace\_max\_size options to cover all +of the sizes. For example, if the output of dumpsys is: + +``` + Unreachable memory + 512 bytes in 2 unreachable allocations + ABI: 'arm64' + + 320 bytes unreachable at 71d37787d0 + first 20 bytes of contents: + 71d37787d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 71d37787e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + + 192 bytes unreachable at 71b37b2f50 + first 20 bytes of contents: + 71b37b2f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 71b37b2f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +``` + +Then set the malloc debug options thusly: + +``` +adb shell setprop libc.debug.malloc.options "'backtrace backtrace_min_size=192 backtrace_max_size=320'" +``` + +This will backtrace allocations of any size between 192 bytes and 320 bytes +inclusively. + +After setting the backtrace size options, restart the application so +that running dumpsys again will include the actual backtrace of the +leaking allocations. + ### C interface ### #### `bool LogUnreachableMemory(bool log_contents, size_t limit)` #### diff --git a/ThreadCapture.cpp b/ThreadCapture.cpp index 45eb55d..99d6494 100644 --- a/ThreadCapture.cpp +++ b/ThreadCapture.cpp @@ -226,16 +226,16 @@ bool ThreadCaptureImpl::PtraceThreadInfo(pid_t tid, ThreadInfo& thread_info) { thread_info.regs.assign(®s[0], ®s[num_regs]); const int sp = -#if defined(__x86_64__) - offsetof(struct pt_regs, rsp) / sizeof(uintptr_t) -#elif defined(__i386__) - offsetof(struct pt_regs, esp) / sizeof(uintptr_t) +#if defined(__aarch64__) + offsetof(struct user_pt_regs, sp) / sizeof(uintptr_t) #elif defined(__arm__) offsetof(struct pt_regs, ARM_sp) / sizeof(uintptr_t) -#elif defined(__aarch64__) - offsetof(struct user_pt_regs, sp) / sizeof(uintptr_t) -#elif defined(__mips__) || defined(__mips64__) - offsetof(struct pt_regs, regs[29]) / sizeof(uintptr_t) +#elif defined(__i386__) + offsetof(struct pt_regs, esp) / sizeof(uintptr_t) +#elif defined(__riscv) + offsetof(struct user_regs_struct, sp) / sizeof(uintptr_t) +#elif defined(__x86_64__) + offsetof(struct pt_regs, rsp) / sizeof(uintptr_t) #else #error Unrecognized architecture #endif |