Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755482Ab0FNIb0 (ORCPT ); Mon, 14 Jun 2010 04:31:26 -0400 Received: from e23smtp04.au.ibm.com ([202.81.31.146]:32952 "EHLO e23smtp04.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755141Ab0FNIbX (ORCPT ); Mon, 14 Jun 2010 04:31:23 -0400 From: Srikar Dronamraju To: Peter Zijlstra , Ingo Molnar Cc: Masami Hiramatsu , Mel Gorman , Srikar Dronamraju , Randy Dunlap , Arnaldo Carvalho de Melo , Steven Rostedt , Roland McGrath , "H. Peter Anvin" , Christoph Hellwig , Ananth N Mavinakayanahalli , Oleg Nesterov , Mark Wielaard , Mathieu Desnoyers , LKML , Linus Torvalds , Frederic Weisbecker , Jim Keniston , "Rafael J. Wysocki" , "Frank Ch. Eigler" , Andrew Morton , "Paul E. McKenney" Date: Mon, 14 Jun 2010 13:59:23 +0530 Message-Id: <20100614082923.29068.80447.sendpatchset@localhost6.localdomain6> In-Reply-To: <20100614082748.29068.21995.sendpatchset@localhost6.localdomain6> References: <20100614082748.29068.21995.sendpatchset@localhost6.localdomain6> Subject: [PATCH v5 8/14] samples: Uprobes samples Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5634 Lines: 188 samples.patch From: Srikar Dronamraju Uprobes Samples This provides an example uprobes module in the samples directory. To run this module run (as root) insmod uprobe_example.ko vaddr= pid= Where is the address where we want to place the probe. is the pid of the process we are interested to probe. example: - # cd samples/uprobes [get the virtual address to place the probe.] # vaddr=0x$(objdump -T /bin/bash |awk '/echo_builtin/ {print $1}') [Run a bash shell in the background; have it echo 4 lines.] # (sleep 10; echo 1; echo 2; echo 3; echo 4) & [Probe calls echo_builtin() in the background bash process.] # insmod uprobe_example.ko vaddr=$vaddr pid=$! # sleep 10 # rmmod uprobe_example # dmesg | tail -n 3 Registering uprobe on pid 10875, vaddr 0x45aa30 Unregistering uprobe on pid 10875, vaddr 0x45aa30 Probepoint was hit 4 times # [ Output shows that echo_builtin function was hit 4 times. ] Signed-off-by: Srikar Dronamraju --- samples/Kconfig | 7 +++ samples/Makefile | 2 - samples/uprobes/Makefile | 17 ++++++++ samples/uprobes/uprobe_example.c | 83 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 1 deletions(-) create mode 100644 samples/uprobes/Makefile create mode 100644 samples/uprobes/uprobe_example.c diff --git a/samples/Kconfig b/samples/Kconfig index 8924f72..50b8b1c 100644 --- a/samples/Kconfig +++ b/samples/Kconfig @@ -44,4 +44,11 @@ config SAMPLE_HW_BREAKPOINT help This builds kernel hardware breakpoint example modules. +config SAMPLE_UPROBES + tristate "Build uprobes example -- loadable module only" + depends on UPROBES && m + help + This builds uprobes example module. + + endif # SAMPLES diff --git a/samples/Makefile b/samples/Makefile index 0f15e6d..c8fe6f9 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -1,4 +1,4 @@ # Makefile for Linux samples code obj-$(CONFIG_SAMPLES) += kobject/ kprobes/ tracepoints/ trace_events/ \ - hw_breakpoint/ + hw_breakpoint/ uprobes/ diff --git a/samples/uprobes/Makefile b/samples/uprobes/Makefile new file mode 100644 index 0000000..f535f6f --- /dev/null +++ b/samples/uprobes/Makefile @@ -0,0 +1,17 @@ +# builds the uprobes example kernel modules; +# then to use one (as root): +# insmod vaddr= pid= +# +# +# example: - +# vaddr=0x$(objdump -T /bin/bash |awk '/echo_builtin/ print $1}') +# (sleep 10; echo 1; echo 2; echo 3; echo 4) & +# insmod uprobe_example.ko vaddr=$vaddr pid=$! +# sleep 10 +# rmmod uprobe_example +# dmesg | tail -n 3 +# Registering uprobe on pid 3920, vaddr 0x45aa30 +# Unregistering uprobe on pid 3920, vaddr 0x45aa30 +# Probepoint was hit 4 times + +obj-$(CONFIG_SAMPLE_UPROBES) += uprobe_example.o diff --git a/samples/uprobes/uprobe_example.c b/samples/uprobes/uprobe_example.c new file mode 100644 index 0000000..f625bae --- /dev/null +++ b/samples/uprobes/uprobe_example.c @@ -0,0 +1,83 @@ +/* + * Uprobes Example + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (C) IBM Corporation, 2008-2010 + * Authors: + * Srikar Dronamraju + * Jim Keniston + */ + +#include +#include +#include +#include + +/* + * Usage: insmod uprobe_example.ko pid= vaddr=
[verbose=0] + * where identifies the probed process and
is the virtual + * address of the probed instruction. + */ + +static int pid; +module_param(pid, int, 0); +MODULE_PARM_DESC(pid, "pid"); + +static int verbose; +module_param(verbose, int, 0); +MODULE_PARM_DESC(verbose, "verbose"); + +static long vaddr; +module_param(vaddr, long, 0); +MODULE_PARM_DESC(vaddr, "vaddr"); + +static int nhits; +static struct uprobe usp; + +static void uprobe_handler(struct uprobe *u, struct pt_regs *regs) +{ + nhits++; + if (verbose) + printk(KERN_INFO "Hit #%d on probepoint at %#lx\n", + nhits, u->vaddr); +} + +int __init init_module(void) +{ + int ret; + usp.pid = pid; + usp.vaddr = vaddr; + usp.handler = uprobe_handler; + printk(KERN_INFO "Registering uprobe on pid %d, vaddr %#lx\n", + usp.pid, usp.vaddr); + ret = register_uprobe(&usp); + if (ret != 0) { + printk(KERN_ERR "register_uprobe() failed, returned %d\n", ret); + printk(KERN_ERR "Usage: insmod uprobe_example.ko pid= " + "vaddr=
\n"); + return ret; + } + return 0; +} + +void __exit cleanup_module(void) +{ + printk(KERN_INFO "Unregistering uprobe on pid %d, vaddr %#lx\n", + usp.pid, usp.vaddr); + printk(KERN_INFO "Probepoint was hit %d times\n", nhits); + unregister_uprobe(&usp); +} +MODULE_LICENSE("GPL"); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/