|
@@ -451,12 +451,14 @@ end:
|
|
}
|
|
}
|
|
|
|
|
|
static int show_available_vars_at(int fd, struct perf_probe_event *pev,
|
|
static int show_available_vars_at(int fd, struct perf_probe_event *pev,
|
|
- int max_vls, bool externs)
|
|
|
|
|
|
+ int max_vls, struct strfilter *_filter,
|
|
|
|
+ bool externs)
|
|
{
|
|
{
|
|
char *buf;
|
|
char *buf;
|
|
- int ret, i;
|
|
|
|
|
|
+ int ret, i, nvars;
|
|
struct str_node *node;
|
|
struct str_node *node;
|
|
struct variable_list *vls = NULL, *vl;
|
|
struct variable_list *vls = NULL, *vl;
|
|
|
|
+ const char *var;
|
|
|
|
|
|
buf = synthesize_perf_probe_point(&pev->point);
|
|
buf = synthesize_perf_probe_point(&pev->point);
|
|
if (!buf)
|
|
if (!buf)
|
|
@@ -464,36 +466,45 @@ static int show_available_vars_at(int fd, struct perf_probe_event *pev,
|
|
pr_debug("Searching variables at %s\n", buf);
|
|
pr_debug("Searching variables at %s\n", buf);
|
|
|
|
|
|
ret = find_available_vars_at(fd, pev, &vls, max_vls, externs);
|
|
ret = find_available_vars_at(fd, pev, &vls, max_vls, externs);
|
|
- if (ret > 0) {
|
|
|
|
- /* Some variables were found */
|
|
|
|
- fprintf(stdout, "Available variables at %s\n", buf);
|
|
|
|
- for (i = 0; i < ret; i++) {
|
|
|
|
- vl = &vls[i];
|
|
|
|
- /*
|
|
|
|
- * A probe point might be converted to
|
|
|
|
- * several trace points.
|
|
|
|
- */
|
|
|
|
- fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol,
|
|
|
|
- vl->point.offset);
|
|
|
|
- free(vl->point.symbol);
|
|
|
|
- if (vl->vars) {
|
|
|
|
- strlist__for_each(node, vl->vars)
|
|
|
|
|
|
+ if (ret <= 0) {
|
|
|
|
+ pr_err("Failed to find variables at %s (%d)\n", buf, ret);
|
|
|
|
+ goto end;
|
|
|
|
+ }
|
|
|
|
+ /* Some variables are found */
|
|
|
|
+ fprintf(stdout, "Available variables at %s\n", buf);
|
|
|
|
+ for (i = 0; i < ret; i++) {
|
|
|
|
+ vl = &vls[i];
|
|
|
|
+ /*
|
|
|
|
+ * A probe point might be converted to
|
|
|
|
+ * several trace points.
|
|
|
|
+ */
|
|
|
|
+ fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol,
|
|
|
|
+ vl->point.offset);
|
|
|
|
+ free(vl->point.symbol);
|
|
|
|
+ nvars = 0;
|
|
|
|
+ if (vl->vars) {
|
|
|
|
+ strlist__for_each(node, vl->vars) {
|
|
|
|
+ var = strchr(node->s, '\t') + 1;
|
|
|
|
+ if (strfilter__compare(_filter, var)) {
|
|
fprintf(stdout, "\t\t%s\n", node->s);
|
|
fprintf(stdout, "\t\t%s\n", node->s);
|
|
- strlist__delete(vl->vars);
|
|
|
|
- } else
|
|
|
|
- fprintf(stdout, "(No variables)\n");
|
|
|
|
|
|
+ nvars++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ strlist__delete(vl->vars);
|
|
}
|
|
}
|
|
- free(vls);
|
|
|
|
- } else
|
|
|
|
- pr_err("Failed to find variables at %s (%d)\n", buf, ret);
|
|
|
|
-
|
|
|
|
|
|
+ if (nvars == 0)
|
|
|
|
+ fprintf(stdout, "\t\t(No matched variables)\n");
|
|
|
|
+ }
|
|
|
|
+ free(vls);
|
|
|
|
+end:
|
|
free(buf);
|
|
free(buf);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
/* Show available variables on given probe point */
|
|
/* Show available variables on given probe point */
|
|
int show_available_vars(struct perf_probe_event *pevs, int npevs,
|
|
int show_available_vars(struct perf_probe_event *pevs, int npevs,
|
|
- int max_vls, const char *module, bool externs)
|
|
|
|
|
|
+ int max_vls, const char *module,
|
|
|
|
+ struct strfilter *_filter, bool externs)
|
|
{
|
|
{
|
|
int i, fd, ret = 0;
|
|
int i, fd, ret = 0;
|
|
|
|
|
|
@@ -510,7 +521,8 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs,
|
|
setup_pager();
|
|
setup_pager();
|
|
|
|
|
|
for (i = 0; i < npevs && ret >= 0; i++)
|
|
for (i = 0; i < npevs && ret >= 0; i++)
|
|
- ret = show_available_vars_at(fd, &pevs[i], max_vls, externs);
|
|
|
|
|
|
+ ret = show_available_vars_at(fd, &pevs[i], max_vls, _filter,
|
|
|
|
+ externs);
|
|
|
|
|
|
close(fd);
|
|
close(fd);
|
|
return ret;
|
|
return ret;
|
|
@@ -556,7 +568,9 @@ int show_line_range(struct line_range *lr __unused, const char *module __unused)
|
|
|
|
|
|
int show_available_vars(struct perf_probe_event *pevs __unused,
|
|
int show_available_vars(struct perf_probe_event *pevs __unused,
|
|
int npevs __unused, int max_vls __unused,
|
|
int npevs __unused, int max_vls __unused,
|
|
- const char *module __unused, bool externs __unused)
|
|
|
|
|
|
+ const char *module __unused,
|
|
|
|
+ struct strfilter *filter __unused,
|
|
|
|
+ bool externs __unused)
|
|
{
|
|
{
|
|
pr_warning("Debuginfo-analysis is not supported.\n");
|
|
pr_warning("Debuginfo-analysis is not supported.\n");
|
|
return -ENOSYS;
|
|
return -ENOSYS;
|