perf script: Exception handling when the print fmt is empty
PATCH 2/3 perf script: Exception handling when the print fmt is empty
After collecting samples for events 'syscalls:', perf-script with python script doesn't occasionally work generating a segmentation fault.
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.
--- 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(+)
tools/perf/util/scripting-engines/trace-event-perl.c +3 -0
@@ -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 ;
tools/perf/util/scripting-engines/trace-event-python.c +3 -0
@@ -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 ;
Signature · 1 line
2.5.0
Em Fri, Feb 26, 2016 at 12:12:59AM +0900, Taeung Song escreveu:
Quoted 3 lines
After collecting samples for events 'syscalls:', perf-script with python script doesn't occasionally work generating a segmentation fault.
Thanks, applied.
- Arnaldo
Quoted 71 lines
The reason is that the print fmt is empty and a value of
event->print_fmt.argsis 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.pyin 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 <[email protected]>Cc Wang Nan <[email protected]>Signed-off-by Taeung Song <[email protected]>--- 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(+)tools/perf/util/scripting-engines/trace-event-perl.c +3
-0@@ -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 ;tools/perf/util/scripting-engines/trace-event-python.c +3
-0@@ -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 ;Signature · 1 line
2.5.0
Hi, Arnaldo
Quoted 8 lines · Arnaldo Carvalho de Melo
Em Fri, Feb 26, 2016 at 12:12:59AM +0900, Taeung Song escreveu:
Quoted 3 lines
After collecting samples for events 'syscalls:', perf-script with python script doesn't occasionally work generating a segmentation fault.
Thanks, applied.
- Arnaldo
Thank you!!
Taeung
tip-bot for Taeung Song
merge botperf script: Exception handling when the print fmt is empty
Commit-ID: 8579aca3f9a8f890d6d94ccaed7cf5fd54a0c3bd Gitweb: http://git.kernel.org/tip/8579aca3f9a8f890d6d94ccaed7cf5fd54a0c3bd Author: Taeung Song <[email protected]> AuthorDate: Fri, 26 Feb 2016 00:12:59 +0900 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 25 Feb 2016 12:54:20 -0300
perf script: Exception handling when the print fmt is empty
After collecting samples for events 'syscalls:', perf-script with python script doesn't occasionally work generating a segmentation fault.
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.
--- 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(+)
tools/perf/util/scripting-engines/trace-event-perl.c +3 -0
@@ -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 ;
tools/perf/util/scripting-engines/trace-event-python.c +3 -0
@@ -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 ;