diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 1bb8f15..8a35943 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -1501,17 +1501,13 @@ static int trace__run(struct trace *trace, int argc, const char **argv) } if (perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_enter", trace__sys_enter) || - perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_exit", trace__sys_exit)) { - fprintf(trace->output, "Couldn't read the raw_syscalls tracepoints information!\n"); - goto out_delete_evlist; - } + perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_exit", trace__sys_exit)) + goto out_error_tp; if (trace->sched && perf_evlist__add_newtp(evlist, "sched", "sched_stat_runtime", - trace__sched_stat_runtime)) { - fprintf(trace->output, "Couldn't read the sched_stat_runtime tracepoint information!\n"); - goto out_delete_evlist; - } + trace__sched_stat_runtime)) + goto out_error_tp; err = perf_evlist__create_maps(evlist, &trace->opts.target); if (err < 0) { @@ -1628,6 +1624,23 @@ out_delete_evlist: out: trace->live = false; return err; +out_error_tp: + switch (errno) { + case ENOENT: + fputs("Is debugfs mounted? Try 'sudo mount -t debugfs nodev /sys/kernel/debug'\n", trace->output); + break; + case EACCES: + fprintf(trace->output, + "Couldn't access debugfs. Try 'sudo mount -o remount,mode=755 %s'\n", + debugfs_mountpoint); + break; + default: + fprintf(trace->output, "Can't trace: %s!\n", sys_errlist[errno]); + break; + + } + + goto out_unmap_evlist; } static int trace__replay(struct trace *trace)