Skip to contentSkip to conversation

perf script: Exception handling when the print fmt is empty

PATCH Applied Taeung Song 3 participants 4 messages Feb 25, 2016 – Feb 27, 2016 perf events

v1 of 3 Applied Latest is v3 →

lore
Share & tools
lore
#0 lore raw

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
index 544509c..b3aabc0 100644
@@ -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
index d72fafc..309d90f 100644
@@ -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
maintainer Applied
#1 lore raw

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.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
index 544509c..b3aabc0 100644
@@ -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
index d72fafc..309d90f 100644
@@ -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
#2 lore raw

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

#3 lore raw
In reply to Taeung Song
perf 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
index 544509c..b3aabc0 100644
@@ -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
index d72fafc..309d90f 100644
@@ -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;