|
|
|
@ -59,7 +59,7 @@ static struct { |
|
|
|
|
struct perf_probe_event events[MAX_PROBES]; |
|
|
|
|
struct strlist *dellist; |
|
|
|
|
struct line_range line_range; |
|
|
|
|
const char *target; |
|
|
|
|
char *target; |
|
|
|
|
int max_probe_points; |
|
|
|
|
struct strfilter *filter; |
|
|
|
|
} params; |
|
|
|
@ -98,7 +98,10 @@ static int set_target(const char *ptr) |
|
|
|
|
* short module name. |
|
|
|
|
*/ |
|
|
|
|
if (!params.target && ptr && *ptr == '/') { |
|
|
|
|
params.target = ptr; |
|
|
|
|
params.target = strdup(ptr); |
|
|
|
|
if (!params.target) |
|
|
|
|
return -ENOMEM; |
|
|
|
|
|
|
|
|
|
found = 1; |
|
|
|
|
buf = ptr + (strlen(ptr) - 3); |
|
|
|
|
|
|
|
|
@ -116,6 +119,9 @@ static int parse_probe_event_argv(int argc, const char **argv) |
|
|
|
|
char *buf; |
|
|
|
|
|
|
|
|
|
found_target = set_target(argv[0]); |
|
|
|
|
if (found_target < 0) |
|
|
|
|
return found_target; |
|
|
|
|
|
|
|
|
|
if (found_target && argc == 1) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
@ -217,7 +223,6 @@ static int opt_show_lines(const struct option *opt __maybe_unused, |
|
|
|
|
|
|
|
|
|
params.show_lines = true; |
|
|
|
|
ret = parse_line_range_desc(str, ¶ms.line_range); |
|
|
|
|
INIT_LIST_HEAD(¶ms.line_range.line_list); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
@ -263,7 +268,28 @@ static int opt_set_filter(const struct option *opt __maybe_unused, |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) |
|
|
|
|
static void init_params(void) |
|
|
|
|
{ |
|
|
|
|
line_range__init(¶ms.line_range); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void cleanup_params(void) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < params.nevents; i++) |
|
|
|
|
clear_perf_probe_event(params.events + i); |
|
|
|
|
if (params.dellist) |
|
|
|
|
strlist__delete(params.dellist); |
|
|
|
|
line_range__clear(¶ms.line_range); |
|
|
|
|
free(params.target); |
|
|
|
|
if (params.filter) |
|
|
|
|
strfilter__delete(params.filter); |
|
|
|
|
memset(¶ms, 0, sizeof(params)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
__cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) |
|
|
|
|
{ |
|
|
|
|
const char * const probe_usage[] = { |
|
|
|
|
"perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]", |
|
|
|
@ -417,6 +443,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) |
|
|
|
|
ret = show_available_funcs(params.target, params.filter, |
|
|
|
|
params.uprobes); |
|
|
|
|
strfilter__delete(params.filter); |
|
|
|
|
params.filter = NULL; |
|
|
|
|
if (ret < 0) |
|
|
|
|
pr_err(" Error: Failed to show functions." |
|
|
|
|
" (%d)\n", ret); |
|
|
|
@ -456,6 +483,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) |
|
|
|
|
params.filter, |
|
|
|
|
params.show_ext_vars); |
|
|
|
|
strfilter__delete(params.filter); |
|
|
|
|
params.filter = NULL; |
|
|
|
|
if (ret < 0) |
|
|
|
|
pr_err(" Error: Failed to show vars. (%d)\n", ret); |
|
|
|
|
return ret; |
|
|
|
@ -464,7 +492,6 @@ int cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) |
|
|
|
|
|
|
|
|
|
if (params.dellist) { |
|
|
|
|
ret = del_perf_probe_events(params.dellist); |
|
|
|
|
strlist__delete(params.dellist); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
pr_err(" Error: Failed to delete events. (%d)\n", ret); |
|
|
|
|
return ret; |
|
|
|
@ -483,3 +510,14 @@ int cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int cmd_probe(int argc, const char **argv, const char *prefix) |
|
|
|
|
{ |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
init_params(); |
|
|
|
|
ret = __cmd_probe(argc, argv, prefix); |
|
|
|
|
cleanup_params(); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|