aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/traps_64.c
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2008-01-30 07:33:18 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-30 07:33:18 -0500
commit03252919b79891063cf99145612360efbdf9500b (patch)
treea80dc0c89448308d75d247446a5a04c84cb708a6 /arch/x86/kernel/traps_64.c
parentd3432896dae72ee97deb850ad7bbc30329d32c0d (diff)
x86: print which shared library/executable faulted in segfault etc. messages v3
They now look like: hal-resmgr[13791]: segfault at 3c rip 2b9c8caec182 rsp 7fff1e825d30 error 4 in libacl.so.1.1.0[2b9c8caea000+6000] This makes it easier to pinpoint bugs to specific libraries. And printing the offset into a mapping also always allows to find the correct fault point in a library even with randomized mappings. Previously there was no way to actually find the correct code address inside the randomized mapping. Relies on earlier patch to shorten the printk formats. They are often now longer than 80 characters, but I think that's worth it. [includes fix from Eric Dumazet to check d_path error value] Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/traps_64.c')
-rw-r--r--arch/x86/kernel/traps_64.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c
index 814801f4eb9e..911ed28afff8 100644
--- a/arch/x86/kernel/traps_64.c
+++ b/arch/x86/kernel/traps_64.c
@@ -642,11 +642,14 @@ static void __kprobes do_trap(int trapnr, int signr, char *str,
642 tsk->thread.trap_no = trapnr; 642 tsk->thread.trap_no = trapnr;
643 643
644 if (show_unhandled_signals && unhandled_signal(tsk, signr) && 644 if (show_unhandled_signals && unhandled_signal(tsk, signr) &&
645 printk_ratelimit()) 645 printk_ratelimit()) {
646 printk(KERN_INFO 646 printk(KERN_INFO
647 "%s[%d] trap %s ip:%lx sp:%lx error:%lx\n", 647 "%s[%d] trap %s ip:%lx sp:%lx error:%lx",
648 tsk->comm, tsk->pid, str, 648 tsk->comm, tsk->pid, str,
649 regs->ip, regs->sp, error_code); 649 regs->ip, regs->sp, error_code);
650 print_vma_addr(" in ", regs->ip);
651 printk("\n");
652 }
650 653
651 if (info) 654 if (info)
652 force_sig_info(signr, info, tsk); 655 force_sig_info(signr, info, tsk);
@@ -741,11 +744,14 @@ asmlinkage void __kprobes do_general_protection(struct pt_regs * regs,
741 tsk->thread.trap_no = 13; 744 tsk->thread.trap_no = 13;
742 745
743 if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) && 746 if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
744 printk_ratelimit()) 747 printk_ratelimit()) {
745 printk(KERN_INFO 748 printk(KERN_INFO
746 "%s[%d] general protection ip:%lx sp:%lx error:%lx\n", 749 "%s[%d] general protection ip:%lx sp:%lx error:%lx",
747 tsk->comm, tsk->pid, 750 tsk->comm, tsk->pid,
748 regs->ip, regs->sp, error_code); 751 regs->ip, regs->sp, error_code);
752 print_vma_addr(" in ", regs->ip);
753 printk("\n");
754 }
749 755
750 force_sig(SIGSEGV, tsk); 756 force_sig(SIGSEGV, tsk);
751 return; 757 return;