mirror of
https://github.com/systemd/systemd
synced 2024-10-06 16:21:34 +00:00
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;
This commit is contained in:
parent
4db62561c2
commit
7347b3db83
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue