From: licunlong Date: Tue, 8 Mar 2022 11:18:36 +0000 (+0800) Subject: main: log which process send SIGNAL to PID1 X-Git-Tag: v251-rc1~186 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7347b3db838ea3f02afc6c8a6dccac1ff8e7edbd;p=thirdparty%2Fsystemd.git main: log which process send SIGNAL to PID1 This can help users to figure out what makes systemd freeze. 1. Someone kills systemd accidentally, then the sender_pid won't be 1; 2. systemd triggers segfault or assert, then the sender_pid will be 1; --- diff --git a/src/core/main.c b/src/core/main.c index 5009b8d85fd..41a4b4225fe 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -228,7 +228,7 @@ _noreturn_ static void freeze_or_exit_or_reboot(void) { freeze(); } -_noreturn_ static void crash(int sig) { +_noreturn_ static void crash(int sig, siginfo_t *siginfo, void *context) { struct sigaction sa; pid_t pid; @@ -273,6 +273,14 @@ _noreturn_ static void crash(int sig) { siginfo_t status; int r; + if (siginfo) { + _cleanup_free_ char *cmdline = NULL; + pid_t sender_pid = siginfo->si_pid; + + (void) get_process_cmdline(sender_pid, SIZE_MAX, 0, &cmdline); + log_emergency("Caught <%s> from PID "PID_FMT" (%s)", signal_to_string(sig), sender_pid, strna(cmdline)); + } + /* Order things nicely. */ r = wait_for_terminate(pid, &status); if (r < 0) @@ -330,8 +338,8 @@ _noreturn_ static void crash(int sig) { static void install_crash_handler(void) { static const struct sigaction sa = { - .sa_handler = crash, - .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */ + .sa_sigaction = crash, + .sa_flags = SA_NODEFER | SA_SIGINFO, /* So that we can raise the signal again from the signal handler */ }; int r;