malloc_heapprofd: Avoid a spurious error log
In the following scenario: * Heapprofd wants to profile a process. * The process receives the heapprofd signal, so it sets up the ephemeral hooks. * The process does not perform any allocation, so the proper heapprofd hook is never installed. * Heapprofd terminates. * Now heapprofd wants to start a new profiling session. * The process receives the heapprofd signal (again). In the signal handler, no action is needed at this point. The ephemeral hooks are already setup, so, at the next malloc, the proper heapprofd hooks will be installed. Before this commit, the code logged an error message, but still worked correctly. This commit basically just skips the error_log below. Example of the error message that is now suppressed: ``` process: heapprofd: failed to transition kInitialState -> kInstallingEphemeralHook. current state (possible race): 2 ``` Tested by: * Running a process that calls malloc on input from stdin. * (Optional, tested both cases) Enable GWP-Asan by calling `android_mallopt(M_INITIALIZE_GWP_ASAN, ...`. The call will return success. * Attaching heapprofd: ``` external/perfetto/tools/heap_profile -i 1 -p `adb shell pidof <...>` ``` * Detaching heapprofd (CTRL-C). The trace will be empty. * (If not enabled before) Enabling GWP-Asan. The call will fail (because GWP-Asan detects heapprofd hooks). * Reattaching heapprofd. * Triggering some malloc()s in the process. The error log from above will not appear in `adb logcat`. * Detaching heapprofd (CTRL-C). The trace will NOT be empty. Bug: 192258849 Change-Id: I01699b10ecd19e52e1e77f83fcca955ebd885942
This commit is contained in:
parent
617c4b5876
commit
b6d3c78244
1 changed files with 5 additions and 0 deletions
|
@ -273,6 +273,11 @@ void HandleHeapprofdSignal() {
|
|||
atomic_store(&gPreviousDefaultDispatchTable, nullptr);
|
||||
gEphemeralDispatch = *NativeAllocatorDispatch();
|
||||
}
|
||||
} else if (expected == kEphemeralHookInstalled) {
|
||||
// Nothing to do here. The ephemeral hook was installed, but
|
||||
// MallocInitHeapprofdHook() was never called. Since the ephemeral hook
|
||||
// is already there, no need to reinstall it.
|
||||
return;
|
||||
} else if (atomic_compare_exchange_strong(&gHeapprofdState, &expected2,
|
||||
kInstallingEphemeralHook)) {
|
||||
// if we still have hook installed, we can reuse the previous
|
||||
|
|
Loading…
Reference in a new issue