kprobe_example.c (d04659ac94528e9224dbf1aed37dd11dd952cacc) | kprobe_example.c (ea9b50133ffebbd580cb5cd0aa222784d7a2fcb1) |
---|---|
1/* 2 * NOTE: This example is works on x86 and powerpc. 3 * Here's a sample kernel module showing the use of kprobes to dump a 4 * stack trace and selected registers when _do_fork() is called. 5 * 6 * For more information on theory of operation of kprobes, see 7 * Documentation/kprobes.txt 8 * --- 13 unchanged lines hidden (view full) --- 22static struct kprobe kp = { 23 .symbol_name = symbol, 24}; 25 26/* kprobe pre_handler: called just before the probed instruction is executed */ 27static int handler_pre(struct kprobe *p, struct pt_regs *regs) 28{ 29#ifdef CONFIG_X86 | 1/* 2 * NOTE: This example is works on x86 and powerpc. 3 * Here's a sample kernel module showing the use of kprobes to dump a 4 * stack trace and selected registers when _do_fork() is called. 5 * 6 * For more information on theory of operation of kprobes, see 7 * Documentation/kprobes.txt 8 * --- 13 unchanged lines hidden (view full) --- 22static struct kprobe kp = { 23 .symbol_name = symbol, 24}; 25 26/* kprobe pre_handler: called just before the probed instruction is executed */ 27static int handler_pre(struct kprobe *p, struct pt_regs *regs) 28{ 29#ifdef CONFIG_X86 |
30 printk(KERN_INFO "pre_handler: p->addr = 0x%p, ip = %lx," | 30 printk(KERN_INFO "<%s> pre_handler: p->addr = 0x%p, ip = %lx," |
31 " flags = 0x%lx\n", | 31 " flags = 0x%lx\n", |
32 p->addr, regs->ip, regs->flags); | 32 p->symbol_name, p->addr, regs->ip, regs->flags); |
33#endif 34#ifdef CONFIG_PPC | 33#endif 34#ifdef CONFIG_PPC |
35 printk(KERN_INFO "pre_handler: p->addr = 0x%p, nip = 0x%lx," | 35 printk(KERN_INFO "<%s> pre_handler: p->addr = 0x%p, nip = 0x%lx," |
36 " msr = 0x%lx\n", | 36 " msr = 0x%lx\n", |
37 p->addr, regs->nip, regs->msr); | 37 p->symbol_name, p->addr, regs->nip, regs->msr); |
38#endif 39#ifdef CONFIG_MIPS | 38#endif 39#ifdef CONFIG_MIPS |
40 printk(KERN_INFO "pre_handler: p->addr = 0x%p, epc = 0x%lx," | 40 printk(KERN_INFO "<%s> pre_handler: p->addr = 0x%p, epc = 0x%lx," |
41 " status = 0x%lx\n", | 41 " status = 0x%lx\n", |
42 p->addr, regs->cp0_epc, regs->cp0_status); | 42 p->symbol_name, p->addr, regs->cp0_epc, regs->cp0_status); |
43#endif 44#ifdef CONFIG_TILEGX | 43#endif 44#ifdef CONFIG_TILEGX |
45 printk(KERN_INFO "pre_handler: p->addr = 0x%p, pc = 0x%lx," | 45 printk(KERN_INFO "<%s> pre_handler: p->addr = 0x%p, pc = 0x%lx," |
46 " ex1 = 0x%lx\n", | 46 " ex1 = 0x%lx\n", |
47 p->addr, regs->pc, regs->ex1); | 47 p->symbol_name, p->addr, regs->pc, regs->ex1); |
48#endif 49 50 /* A dump_stack() here will give a stack backtrace */ 51 return 0; 52} 53 54/* kprobe post_handler: called after the probed instruction is executed */ 55static void handler_post(struct kprobe *p, struct pt_regs *regs, 56 unsigned long flags) 57{ 58#ifdef CONFIG_X86 | 48#endif 49 50 /* A dump_stack() here will give a stack backtrace */ 51 return 0; 52} 53 54/* kprobe post_handler: called after the probed instruction is executed */ 55static void handler_post(struct kprobe *p, struct pt_regs *regs, 56 unsigned long flags) 57{ 58#ifdef CONFIG_X86 |
59 printk(KERN_INFO "post_handler: p->addr = 0x%p, flags = 0x%lx\n", 60 p->addr, regs->flags); | 59 printk(KERN_INFO "<%s> post_handler: p->addr = 0x%p, flags = 0x%lx\n", 60 p->symbol_name, p->addr, regs->flags); |
61#endif 62#ifdef CONFIG_PPC | 61#endif 62#ifdef CONFIG_PPC |
63 printk(KERN_INFO "post_handler: p->addr = 0x%p, msr = 0x%lx\n", 64 p->addr, regs->msr); | 63 printk(KERN_INFO "<%s> post_handler: p->addr = 0x%p, msr = 0x%lx\n", 64 p->symbol_name, p->addr, regs->msr); |
65#endif 66#ifdef CONFIG_MIPS | 65#endif 66#ifdef CONFIG_MIPS |
67 printk(KERN_INFO "post_handler: p->addr = 0x%p, status = 0x%lx\n", 68 p->addr, regs->cp0_status); | 67 printk(KERN_INFO "<%s> post_handler: p->addr = 0x%p, status = 0x%lx\n", 68 p->symbol_name, p->addr, regs->cp0_status); |
69#endif 70#ifdef CONFIG_TILEGX | 69#endif 70#ifdef CONFIG_TILEGX |
71 printk(KERN_INFO "post_handler: p->addr = 0x%p, ex1 = 0x%lx\n", 72 p->addr, regs->ex1); | 71 printk(KERN_INFO "<%s> post_handler: p->addr = 0x%p, ex1 = 0x%lx\n", 72 p->symbol_name, p->addr, regs->ex1); |
73#endif 74} 75 76/* 77 * fault_handler: this is called if an exception is generated for any 78 * instruction within the pre- or post-handler, or when Kprobes 79 * single-steps the probed instruction. 80 */ --- 33 unchanged lines hidden --- | 73#endif 74} 75 76/* 77 * fault_handler: this is called if an exception is generated for any 78 * instruction within the pre- or post-handler, or when Kprobes 79 * single-steps the probed instruction. 80 */ --- 33 unchanged lines hidden --- |