Commit 83302e79 authored by Chris Phlipot's avatar Chris Phlipot Committed by Arnaldo Carvalho de Melo

perf script: Fix export of callchains with recursion in db-export

When an IP with an unresolved symbol occurs in the callchain more than
once (ie. recursion), then duplicate symbols can be created because
the callchain nodes are never updated after they are first created.

To fix this issue we call dso__find_symbol whenever we encounter a NULL
symbol, in case we already added a symbol at that IP since we started
traversing the callchain.

This change prevents duplicate symbols from being exported when duplicate
IPs are present in the callchain.
Signed-off-by: default avatarChris Phlipot <cphlipot0@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1462937209-6032-5-git-send-email-cphlipot0@gmail.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 7a2544c0
...@@ -326,6 +326,10 @@ static struct call_path *call_path_from_sample(struct db_export *dbe, ...@@ -326,6 +326,10 @@ static struct call_path *call_path_from_sample(struct db_export *dbe,
al.machine = machine; al.machine = machine;
al.addr = node->ip; al.addr = node->ip;
if (al.map && !al.sym)
al.sym = dso__find_symbol(al.map->dso, MAP__FUNCTION,
al.addr);
db_ids_from_al(dbe, &al, &dso_db_id, &sym_db_id, &offset); db_ids_from_al(dbe, &al, &dso_db_id, &sym_db_id, &offset);
/* add node to the call path tree if it doesn't exist */ /* add node to the call path tree if it doesn't exist */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment