Messages in this thread | | | Date | Thu, 25 Feb 2016 12:59:14 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | Re: [PATCH 2/3] perf script: Exception handling when the print fmt is empty |
| |
Em Fri, Feb 26, 2016 at 12:12:59AM +0900, Taeung Song escreveu: > After collecting samples for events 'syscalls:', > perf-script with python script doesn't occasionally > work generating a segmentation fault.
Thanks, applied.
- Arnaldo
> The reason is that the print fmt is empty and > a value of event->print_fmt.args is NULL, so > dereferencing the null pointer results in > a segmentation fault i.e. > > # perf record -e syscalls:* > # perf script -g python > # perf script -s perf-script.py > > in trace_begin > syscalls__sys_enter_brk 3 79841.832099154 3777 test.sh syscall_nr=12, brk=0 > > ... (omitted) ... > > Segmentation fault (core dumped) > > For example, a format of sys_enter_getuid() hasn't > print fmt as below. > > # cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_getuid/format > name: sys_enter_getuid > ID: 188 > format: > field:unsigned short common_type; offset:0; size:2; signed:0; > field:unsigned char common_flags; offset:2; size:1; signed:0; > field:unsigned char common_preempt_count; offset:3; size:1; signed:0; > field:int common_pid; offset:4; size:4; signed:1; > field:int syscall_nr; offset:8; size:4; signed:1; > > print fmt: "" > > So add exception handling to avoid this problem. > > Cc: Jiri Olsa <jolsa@kernel.org> > Cc: Wang Nan <wangnan0@huawei.com> > Signed-off-by: Taeung Song <treeze.taeung@gmail.com> > --- > tools/perf/util/scripting-engines/trace-event-perl.c | 3 +++ > tools/perf/util/scripting-engines/trace-event-python.c | 3 +++ > 2 files changed, 6 insertions(+) > > diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c > index 544509c..b3aabc0 100644 > --- a/tools/perf/util/scripting-engines/trace-event-perl.c > +++ b/tools/perf/util/scripting-engines/trace-event-perl.c > @@ -187,6 +187,9 @@ static void define_event_symbols(struct event_format *event, > const char *ev_name, > struct print_arg *args) > { > + if (args == NULL) > + return; > + > switch (args->type) { > case PRINT_NULL: > break; > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c > index d72fafc..309d90f 100644 > --- a/tools/perf/util/scripting-engines/trace-event-python.c > +++ b/tools/perf/util/scripting-engines/trace-event-python.c > @@ -205,6 +205,9 @@ static void define_event_symbols(struct event_format *event, > const char *ev_name, > struct print_arg *args) > { > + if (args == NULL) > + return; > + > switch (args->type) { > case PRINT_NULL: > break; > -- > 2.5.0
| |