dynamic libc: ignore ART profiling signal by default.
These solves the issue that targetting non-profilable apps crashed them.
There is still a race condition between starting the app and the SIG_IGN
being installed, but that will be fixed in follow-ups.
This also does not cover programs that statically link libc, but those are
rare.
This might be reverted if we find a more general solution to
b/151835887.
Bug: 151328035
Test: java profile sysui, doesn't crash
Test: atest CtsBionicTestCases
Change-Id: I6b99352ed50afe15a609f7ddb85312c2676ddf11
diff --git a/libc/bionic/android_profiling_dynamic.cpp b/libc/bionic/android_profiling_dynamic.cpp
index 54f896c..9d92a6d 100644
--- a/libc/bionic/android_profiling_dynamic.cpp
+++ b/libc/bionic/android_profiling_dynamic.cpp
@@ -63,6 +63,14 @@
action.sa_flags = SA_SIGINFO | SA_RESTART;
action.sa_sigaction = HandleProfilingSignal;
sigaction(BIONIC_SIGNAL_PROFILER, &action, nullptr);
+
+ // The perfetto_hprof ART plugin installs a signal handler to handle this signal. That plugin
+ // does not get loaded for a) non-apps, b) non-profilable apps on user. The default signal
+ // disposition is to crash. We do not want the target to crash if we accidentally target a
+ // non-app or non-profilable process.
+ //
+ // This does *not* get run for processes that statically link libc, and those will still crash.
+ signal(BIONIC_SIGNAL_ART_PROFILER, SIG_IGN);
}
static void HandleSigsysSeccompOverride(int, siginfo_t*, void*);