public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@elte.hu>
To: Andrew Morton <akpm@osdl.org>
Cc: torvalds@osdl.org, rusty@rustcorp.com.au,
	linux-kernel@vger.kernel.org, virtualization@lists.osdl.org,
	kraxel@suse.de, zach@vmware.com
Subject: [patch] add print_fatal_signals support
Date: Sat, 20 May 2006 12:16:09 +0200	[thread overview]
Message-ID: <20060520101609.GB660@elte.hu> (raw)
In-Reply-To: <20060520022650.46b048f8.akpm@osdl.org>


* Andrew Morton <akpm@osdl.org> wrote:

> > That could tell us whether 
> > it's an init bug or a glibc bug.
> 
> It tells us neither.  This could be a new kernel bug which only 
> certain old userspace setups are known to trigger.  Until we know 
> exactly why this is occurring, we don't know where the bug is.

actually i've seen this bug long time ago, just didnt remember whether 
it was an init bug or a glibc bug. I believe this bug is in ld.so, but i 
dont remember the specifics.

i've attached another exec-shield goodie that can help debug such bugs: 
the print-fatal-signals=1 boot option (and /proc/sys/kernel runtime 
switch) causes minimal SIGSEGV's info to be printed to the kernel 
console. The glibc (and distro-installer) folks find it very useful and 
have used it numerous times in the past few years.

	Ingo

------
Subject: add print_fatal_signals support
From: Ingo Molnar <mingo@elte.hu>

add the print-fatal-signals=1 boot option and the
/proc/sys/kernel/print-fatal-signals runtime switch.

this feature prints some minimal information about userspace segfaults
to the kernel console. This is useful to find early bootup bugs where
userspace debugging is very hard.

defaults to off.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 Documentation/kernel-parameters.txt |    6 +++++
 include/linux/sched.h               |    1 
 include/linux/sysctl.h              |    1 
 kernel/signal.c                     |   38 ++++++++++++++++++++++++++++++++++++
 kernel/sysctl.c                     |    8 +++++++
 5 files changed, 54 insertions(+)

Index: linux-vdso-rand.q/Documentation/kernel-parameters.txt
===================================================================
--- linux-vdso-rand.q.orig/Documentation/kernel-parameters.txt
+++ linux-vdso-rand.q/Documentation/kernel-parameters.txt
@@ -1261,6 +1261,12 @@ running once the system is up.
 			autoconfiguration.
 			Ranges are in pairs (memory base and size).
 
+	print-fatal-signals=
+			[KNL] debug: print fatal signals
+			print-fatal-signals=1: print segfault info to
+			the kernel console.
+			default: off.
+
 	profile=	[KNL] Enable kernel profiling via /proc/profile
 			Format: [schedule,]<number>
 			Param: "schedule" - profile schedule points.
Index: linux-vdso-rand.q/include/linux/sched.h
===================================================================
--- linux-vdso-rand.q.orig/include/linux/sched.h
+++ linux-vdso-rand.q/include/linux/sched.h
@@ -40,6 +40,7 @@
 #include <linux/auxvec.h>	/* For AT_VECTOR_SIZE */
 
 struct exec_domain;
+extern int print_fatal_signals;
 
 /*
  * cloning flags:
Index: linux-vdso-rand.q/include/linux/sysctl.h
===================================================================
--- linux-vdso-rand.q.orig/include/linux/sysctl.h
+++ linux-vdso-rand.q/include/linux/sysctl.h
@@ -93,6 +93,7 @@ enum
 	KERN_CAP_BSET=14,	/* int: capability bounding set */
 	KERN_PANIC=15,		/* int: panic timeout */
 	KERN_REALROOTDEV=16,	/* real root device to mount after initrd */
+	KERN_PRINT_FATAL=17,	/* int: print fatal signals (0/1) */
 
 	KERN_SPARC_REBOOT=21,	/* reboot command on Sparc */
 	KERN_CTLALTDEL=22,	/* int: allow ctl-alt-del to reboot */
Index: linux-vdso-rand.q/kernel/signal.c
===================================================================
--- linux-vdso-rand.q.orig/kernel/signal.c
+++ linux-vdso-rand.q/kernel/signal.c
@@ -763,6 +763,37 @@ out_set:
 #define LEGACY_QUEUE(sigptr, sig) \
 	(((sig) < SIGRTMIN) && sigismember(&(sigptr)->signal, (sig)))
 
+int print_fatal_signals = 0;
+
+static void print_fatal_signal(struct pt_regs *regs, int signr)
+{
+	printk("%s/%d: potentially unexpected fatal signal %d.\n",
+		current->comm, current->pid, signr);
+
+#ifdef __i386__
+	printk("code at %08lx: ", regs->eip);
+	{
+		int i;
+		for (i = 0; i < 16; i++) {
+			unsigned char insn;
+
+			__get_user(insn, (unsigned char *)(regs->eip + i));
+			printk("%02x ", insn);
+		}
+	}
+#endif
+	printk("\n");
+	show_regs(regs);
+}
+
+static int __init setup_print_fatal_signals(char *str)
+{
+	get_option (&str, &print_fatal_signals);
+
+	return 1;
+}
+
+__setup("print-fatal-signals=", setup_print_fatal_signals);
 
 static int
 specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t)
@@ -1748,6 +1779,11 @@ relock:
 		if (!signr)
 			break; /* will return 0 */
 
+		if ((signr == SIGSEGV) && print_fatal_signals) {
+			spin_unlock_irq(&current->sighand->siglock);
+			print_fatal_signal(regs, signr);
+			spin_lock_irq(&current->sighand->siglock);
+		}
 		if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
 			ptrace_signal_deliver(regs, cookie);
 
@@ -1843,6 +1879,8 @@ relock:
 		 * Anything else is fatal, maybe with a core dump.
 		 */
 		current->flags |= PF_SIGNALED;
+		if ((signr != SIGKILL) && print_fatal_signals)
+			print_fatal_signal(regs, signr);
 		if (sig_kernel_coredump(signr)) {
 			/*
 			 * If it was able to dump core, this kills all
Index: linux-vdso-rand.q/kernel/sysctl.c
===================================================================
--- linux-vdso-rand.q.orig/kernel/sysctl.c
+++ linux-vdso-rand.q/kernel/sysctl.c
@@ -330,6 +330,14 @@ static ctl_table kern_table[] = {
 		.proc_handler	= &proc_dointvec,
 	},
 #endif
+	{
+		.ctl_name	= KERN_PRINT_FATAL,
+		.procname	= "print-fatal-signals",
+		.data		= &print_fatal_signals,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+	},
 #ifdef __sparc__
 	{
 		.ctl_name	= KERN_SPARC_REBOOT,

  parent reply	other threads:[~2006-05-20 10:16 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-16  6:03 [PATCH] Gerd Hoffman's move-vsyscall-into-user-address-range patch Rusty Russell
2006-05-16  6:47 ` Ingo Molnar
2006-05-16  8:16   ` Zachary Amsden
2006-05-16  8:40     ` Chris Wright
2006-05-16  8:59       ` Zachary Amsden
2006-05-17  7:49   ` Rusty Russell
2006-05-18  7:54     ` Ingo Molnar
2006-05-18  8:29       ` Gerd Hoffmann
2006-05-20  0:43     ` Andrew Morton
2006-05-20  1:03       ` Ingo Molnar
2006-05-20  1:11         ` Andrew Morton
2006-05-20  1:15           ` Linus Torvalds
2006-05-20  8:53             ` [patch] i386, vdso=[0|1] boot option and /proc/sys/vm/vdso_enabled Ingo Molnar
2006-05-20  9:26               ` Andrew Morton
2006-05-20  9:30                 ` Zachary Amsden
2006-05-20  9:43                   ` Zachary Amsden
2006-05-20  9:48                   ` Andrew Morton
2006-05-20 10:04                     ` Zachary Amsden
2006-05-21  4:38                       ` Rusty Russell
2006-05-21  9:35                         ` Rusty Russell
2006-05-21  9:52                           ` Andrew Morton
2006-05-21 10:41                           ` Ingo Molnar
2006-05-21 11:06                             ` Rusty Russell
2006-05-20  9:54                 ` Ingo Molnar
2006-05-20 10:16                 ` Ingo Molnar [this message]
2006-05-21 11:03                 ` Ingo Molnar
2006-05-21 11:38                   ` Ingo Molnar
2006-05-21 12:33                     ` Andrew Morton
2006-05-21 14:10                 ` Arjan van de Ven
2006-05-22 14:32                   ` Alexey Kuznetsov
2006-05-20  1:16           ` [PATCH] Gerd Hoffman's move-vsyscall-into-user-address-range patch Zachary Amsden
2006-05-20  1:49           ` Andi Kleen
2006-05-20  1:24       ` Arjan van de Ven
2006-05-22 16:29       ` Jakub Jelinek
2006-05-22 16:44         ` Zachary Amsden
2006-05-22 17:14           ` Andrew Morton
2006-05-22 17:27             ` Ingo Molnar
2006-05-22 17:46               ` Linus Torvalds
2006-05-22 19:09                 ` Ingo Molnar
2006-05-22 19:40                   ` Linus Torvalds
2006-05-22 19:14                 ` Adrian Bunk
2006-05-22 19:45                   ` Linus Torvalds
2006-05-22 17:53               ` Andrew Morton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060520101609.GB660@elte.hu \
    --to=mingo@elte.hu \
    --cc=akpm@osdl.org \
    --cc=kraxel@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rusty@rustcorp.com.au \
    --cc=torvalds@osdl.org \
    --cc=virtualization@lists.osdl.org \
    --cc=zach@vmware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox