On Tue, May 31, 2016 at 11:19:08AM +0000, He Kuang wrote:
SNIP
-int unwind__prepare_access(struct thread *thread)should we leave once the address space is set? resseting it over
+int unwind__prepare_access(struct thread *thread, struct map *map)
{
- unwind__register_ops(thread, local_unwind_libunwind_ops);
+ const char *arch;
+ enum dso_type dso_type;
+ struct unwind_libunwind_ops *ops = local_unwind_libunwind_ops;
- return thread->unwind_libunwind_ops->prepare_access(thread);
+ if (!thread->mg->machine->env)
+ return 0;
+
+ dso_type = dso__type(map->dso, thread->mg->machine);
+ if (dso_type == DSO__TYPE_UNKNOWN)
+ return 0;
+
+ if (thread->addr_space)
+ pr_debug("unwind: thread map already set, 64bit is %d, dso=%s\n",
+ dso_type == DSO__TYPE_64BIT, map->dso->name);
again seems like memory leak unless I'm missing something...
also this check should be probably the first thing we do in here
thanks,
jirka
+SNIP
+ arch = normalize_arch(thread->mg->machine->env->arch);
+ pr_debug("unwind: target platform=%s\n", arch);
+
+ unwind__register_ops(thread, ops);
+
+ if (thread->unwind_libunwind_ops)
+ return thread->unwind_libunwind_ops->prepare_access(thread);
+ else
+ return 0;
}