perf/sched: Fix 'perf sched trace'
If we use 'perf sched trace', it will call symbol__init() again, and can lead to a perf tool crash: [root@localhost perf]# ./perf sched trace *** glibc detected *** ./perf: free(): invalid next size (normal): 0x094c1898 *** ======= Backtrace: ========= /lib/libc.so.6[0xb7602404] /lib/libc.so.6(cfree+0x96)[0xb76043b6] ./perf[0x80730fe] ./perf[0x8074c97] ./perf[0x805eb59] ./perf[0x80536fd] ./perf[0x804b618] ./perf[0x804bdc3] /lib/libc.so.6(__libc_start_main+0xe5)[0xb75a9735] ./perf[0x804af81] ======= Memory map: ======== 08048000-08158000 r-xp 00000000 fe:00 556831 /home/eric/.... 08158000-08168000 rw-p 0010f000 fe:00 556831 /home/eric/... 08168000-085fe000 rw-p 00000000 00:00 0 094ab000-094cc000 rw-p 00000000 00:00 0 [heap] Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> LKML-Reference: <4B1C7EE1.8030906@cn.fujitsu.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
b9b1e1c71a
commit
c0777c5aa8
1 changed files with 7 additions and 7 deletions
|
@ -1888,13 +1888,18 @@ static int __cmd_record(int argc, const char **argv)
|
|||
|
||||
int cmd_sched(int argc, const char **argv, const char *prefix __used)
|
||||
{
|
||||
symbol__init(0);
|
||||
|
||||
argc = parse_options(argc, argv, sched_options, sched_usage,
|
||||
PARSE_OPT_STOP_AT_NON_OPTION);
|
||||
if (!argc)
|
||||
usage_with_options(sched_usage, sched_options);
|
||||
|
||||
/*
|
||||
* Aliased to 'perf trace' for now:
|
||||
*/
|
||||
if (!strcmp(argv[0], "trace"))
|
||||
return cmd_trace(argc, argv, prefix);
|
||||
|
||||
symbol__init(0);
|
||||
if (!strncmp(argv[0], "rec", 3)) {
|
||||
return __cmd_record(argc, argv);
|
||||
} else if (!strncmp(argv[0], "lat", 3)) {
|
||||
|
@ -1918,11 +1923,6 @@ int cmd_sched(int argc, const char **argv, const char *prefix __used)
|
|||
usage_with_options(replay_usage, replay_options);
|
||||
}
|
||||
__cmd_replay();
|
||||
} else if (!strcmp(argv[0], "trace")) {
|
||||
/*
|
||||
* Aliased to 'perf trace' for now:
|
||||
*/
|
||||
return cmd_trace(argc, argv, prefix);
|
||||
} else {
|
||||
usage_with_options(sched_usage, sched_options);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue