summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorlicunlong <licunlong1@huawei.com>2022-03-08 12:18:36 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-03-08 16:09:46 +0100
commit7347b3db838ea3f02afc6c8a6dccac1ff8e7edbd (patch)
tree189687ba7afe617fbe6d3354c5d0c5196124425b /src
parentcore: manage SetShowStatus through polkit (diff)
downloadsystemd-7347b3db838ea3f02afc6c8a6dccac1ff8e7edbd.tar.xz
systemd-7347b3db838ea3f02afc6c8a6dccac1ff8e7edbd.zip
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;
Diffstat (limited to 'src')
-rw-r--r--src/core/main.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/core/main.c b/src/core/main.c
index 5009b8d85f..41a4b4225f 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;