Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751679AbbEXIai (ORCPT ); Sun, 24 May 2015 04:30:38 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:28107 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750838AbbEXI2h (ORCPT ); Sun, 24 May 2015 04:28:37 -0400 From: He Kuang To: , , , , , , , , , , , CC: , Subject: [RFC PATCH v2 09/15] perf probe: Support $params without debuginfo Date: Sun, 24 May 2015 08:28:05 +0000 Message-ID: <1432456091-73384-10-git-send-email-hekuang@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1432456091-73384-1-git-send-email-hekuang@huawei.com> References: <1432456091-73384-1-git-send-email-hekuang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.210] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020206.55618BB1.008D,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 883aac7a74ab111a06227f701b256d6e Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3795 Lines: 119 When probing at function entry, fallback $params to calling regs if no debuginfo is provided. Before this path: $ perf probe -v --add='generic_perform_write $params' ... Added new event: Writing event: p:probe/generic_perform_write _stext+1246632 $params [86152.161204] Parse error at argument[0]. (-22) Failed to write event: Invalid argument Error: Failed to add events. Reason: Invalid argument (Code: -22) After this patch: $ perf probe -v --add='generic_perform_write $params' ... Could not open debuginfo. Try to use symbols. ... Added new event: Writing event: p:probe/generic_perform_write _stext+1246632 %di %si %dx %cx %r8 %r9 probe:generic_perform_write (on generic_perform_write with $params) You can now use it in all perf tools, such as: perf record -e probe:generic_perform_write -aR sleep 1 $ perf record -e probe:generic_perform_write dd if=/dev/zero of=/mnt/data/test bs=4k count=3 $ perf script dd 1149 [000] 18574.762652: probe:generic_perform_write: (ffffffff81130770) arg1=0xffff88007c37f600 arg2=0xffff88007ca87e70 arg3=0x0 arg4=0x0 arg5=0x556062e3 arg6=0x12a8010 dd 1149 [000] 18574.762652: probe:generic_perform_write: (ffffffff81130770) arg1=0xffff88007c37f600 arg2=0xffff88007ca87e70 arg3=0x1000 arg4=0x0 arg5=0x556062e3 arg6=0x12a8010 dd 1149 [000] 18574.762652: probe:generic_perform_write: (ffffffff81130770) arg1=0xffff88007c37f600 arg2=0xffff88007ca87e70 arg3=0x2000 arg4=0x0 arg5=0x556062e3 arg6=0x12a8010 Signed-off-by: He Kuang --- tools/perf/util/probe-event.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index d05b77c..7f9f431 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -46,6 +46,7 @@ #include "probe-event.h" #include "probe-finder.h" #include "session.h" +#include #define MAX_CMDLEN 256 #define PERFPROBE_GROUP "probe" @@ -286,6 +287,14 @@ static void clear_probe_trace_events(struct probe_trace_event *tevs, int ntevs) clear_probe_trace_event(tevs + i); } +static bool perf_probe_is_function_entry(struct perf_probe_event *pev) +{ + if (pev->point.file || pev->point.line || pev->point.lazy_line) + return false; + + return true; +} + #ifdef HAVE_DWARF_SUPPORT /* * Some binaries like glibc have special symbols which are on the symbol @@ -1225,6 +1234,33 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev) return 0; } +static char *parse_perf_probe_param(void) +{ + int i = 0; + struct strbuf sb; + bool first = true; + const char *reg_str; + + strbuf_init(&sb, 16); + + while (1) { + reg_str = get_arch_calling_reg_str(i++); + if (!reg_str) + break; + + if (first) { + strbuf_addf(&sb, "%s", reg_str); + first = false; + } else + strbuf_addf(&sb, " %s", reg_str); + } + + if (first) + strbuf_add(&sb, "", 1); + + return strbuf_detach(&sb, NULL); +} + /* Parse perf-probe event argument */ static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg) { @@ -2543,6 +2579,12 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, goto nomem_out; } for (i = 0; i < tev->nargs; i++) { + if (perf_probe_is_function_entry(pev) && + !strcmp(pev->args[i].var, "$params")) { + tev->args[i].value = parse_perf_probe_param(); + continue; + } + if (pev->args[i].name) tev->args[i].name = strdup_or_goto(pev->args[i].name, -- 1.8.5.2 -- 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/