|
@@ -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;
|
|
|
+}
|