Skip to content

Commit

Permalink
perf tools: Enhance parsing events tracepoint error output
Browse files Browse the repository at this point in the history
Enhancing parsing events tracepoint error output. Adding
more verbose output when the tracepoint is not found or
the tracing event path cannot be access.

  $ sudo perf record -e sched:sched_krava ls
  event syntax error: 'sched:sched_krava'
                       \___ unknown tracepoint

  Error:  File /sys/kernel/debug/tracing//tracing/events/sched/sched_krava not found.
  Hint:   Perhaps this kernel misses some CONFIG_ setting to enable this feature?.

  Run 'perf list' for a list of valid events
  ...

  $ perf record -e sched:sched_krava ls
  event syntax error: 'sched:sched_krava'
                       \___ can't access trace events

  Error:  No permissions to read /sys/kernel/debug/tracing//tracing/events/sched/sched_krava
  Hint:   Try 'sudo mount -o remount,mode=755 /sys/kernel/debug'

  Run 'perf list' for a list of valid events
  ...

Signed-off-by: Jiri Olsa <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Raphael Beamonte <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Matt Fleming <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
  • Loading branch information
olsajiri authored and acmel committed Sep 15, 2015
1 parent 8dd2a13 commit 1965817
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 10 deletions.
35 changes: 32 additions & 3 deletions tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -387,15 +387,44 @@ int parse_events_add_cache(struct list_head *list, int *idx,
return add_event(list, idx, &attr, name, NULL);
}

static void tracepoint_error(struct parse_events_error *error, int err,
char *sys, char *name)
{
char help[BUFSIZ];

/*
* We get error directly from syscall errno ( > 0),
* or from encoded pointer's error ( < 0).
*/
err = abs(err);

switch (err) {
case EACCES:
error->str = strdup("can't access trace events");
break;
case ENOENT:
error->str = strdup("unknown tracepoint");
break;
default:
error->str = strdup("failed to add tracepoint");
break;
}

tracing_path__strerror_open_tp(err, help, sizeof(help), sys, name);
error->help = strdup(help);
}

static int add_tracepoint(struct list_head *list, int *idx,
char *sys_name, char *evt_name,
struct parse_events_error *error __maybe_unused)
{
struct perf_evsel *evsel;

evsel = perf_evsel__newtp_idx(sys_name, evt_name, (*idx)++);
if (IS_ERR(evsel))
if (IS_ERR(evsel)) {
tracepoint_error(error, PTR_ERR(evsel), sys_name, evt_name);
return PTR_ERR(evsel);
}

list_add_tail(&evsel->node, list);
return 0;
Expand All @@ -413,7 +442,7 @@ static int add_tracepoint_multi_event(struct list_head *list, int *idx,
snprintf(evt_path, MAXPATHLEN, "%s/%s", tracing_events_path, sys_name);
evt_dir = opendir(evt_path);
if (!evt_dir) {
perror("Can't open event dir");
tracepoint_error(error, errno, sys_name, evt_name);
return -1;
}

Expand Down Expand Up @@ -453,7 +482,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,

events_dir = opendir(tracing_events_path);
if (!events_dir) {
perror("Can't open event dir");
tracepoint_error(error, errno, sys_name, evt_name);
return -1;
}

Expand Down
16 changes: 9 additions & 7 deletions tools/perf/util/parse-events.y
Original file line number Diff line number Diff line change
Expand Up @@ -371,28 +371,30 @@ event_legacy_tracepoint:
PE_NAME '-' PE_NAME ':' PE_NAME
{
struct parse_events_evlist *data = _data;
struct parse_events_error *error = data->error;
struct list_head *list;
char sys_name[128];
snprintf(&sys_name, 128, "%s-%s", $1, $3);

ALLOC_LIST(list);
ABORT_ON(parse_events_add_tracepoint(list, &data->idx, &sys_name, $5, data->error));
if (parse_events_add_tracepoint(list, &data->idx, &sys_name, $5, error)) {
if (error)
error->idx = @1.first_column;
return -1;
}
$$ = list;
}
|
PE_NAME ':' PE_NAME
{
struct parse_events_evlist *data = _data;
struct parse_events_error *error = data->error;
struct list_head *list;

ALLOC_LIST(list);
if (parse_events_add_tracepoint(list, &data->idx, $1, $3, data->error)) {
struct parse_events_error *error = data->error;

if (error) {
if (parse_events_add_tracepoint(list, &data->idx, $1, $3, error)) {
if (error)
error->idx = @1.first_column;
error->str = strdup("unknown tracepoint");
}
return -1;
}
$$ = list;
Expand Down

0 comments on commit 1965817

Please sign in to comment.