Messages in this thread Patch in this message | | | Date | Tue, 7 Jun 2016 15:06:55 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | Re: [PATCH v9 10/14 UPDATE] perf tools: Check the target platform before assigning unwind methods |
| |
Em Sat, Jun 04, 2016 at 05:36:29AM +0000, He Kuang escreveu: > -int unwind__prepare_access(struct thread *thread) > +int unwind__prepare_access(struct thread *thread, struct map *map) > { > + const char *arch; > + enum dso_type dso_type; > + > + if (thread->addr_space) { > + pr_debug("unwind: thread map already set, dso=%s\n", > + map->dso->name); > + return 0; > + } > + > + /* env->arch is NULL for live-mode (i.e. perf top) */ > + if (!thread->mg->machine->env || !thread->mg->machine->env->arch) > + return 0;
You can not simply return here, you need to jump to...
> + > + dso_type = dso__type(map->dso, thread->mg->machine); > + if (dso_type == DSO__TYPE_UNKNOWN) > + return 0; > + > + arch = normalize_arch(thread->mg->machine->env->arch); > + pr_debug("unwind: target platform=%s\n", arch); > +
Here:
> unwind__register_ops(thread, local_unwind_libunwind_ops);
This way things continue work on, say:
perf top --call-graph dwarf
or:
perf trace --call-graph dwarf usleep 1
And also:
perf test unwind
Will pass, fixing it. > return thread->unwind_libunwind_ops->prepare_access(thread); > diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h > index bbd73d9..bf9f593 100644 > --- a/tools/perf/util/unwind.h > +++ b/tools/perf/util/unwind.h > @@ -30,11 +30,12 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, > /* libunwind specific */ > #ifdef HAVE_LIBUNWIND_SUPPORT > int libunwind__arch_reg_id(int regnum); > -int unwind__prepare_access(struct thread *thread); > +int unwind__prepare_access(struct thread *thread, struct map *map); > void unwind__flush_access(struct thread *thread); > void unwind__finish_access(struct thread *thread); > #else > -static inline int unwind__prepare_access(struct thread *thread __maybe_unused) > +static inline int unwind__prepare_access(struct thread *thread __maybe_unused, > + struct map *map __maybe_unused) > { > return 0; > } > @@ -53,7 +54,8 @@ unwind__get_entries(unwind_entry_cb_t cb __maybe_unused, > return 0; > } > > -static inline int unwind__prepare_access(struct thread *thread __maybe_unused) > +static inline int unwind__prepare_access(struct thread *thread __maybe_unused, > + struct map *map __maybe_unused) > { > return 0; > } > -- > 1.8.5.2
| |