3 # Copyright (C) 2013 Christian Babeux <christian.babeux@efficios.com>
4 # Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 # SPDX-License-Identifier: GPL-2.0-only
9 TEST_DESC
="Kernel tracer - System calls"
15 # `gen-syscall-event` starts and waits for the creation a file passed by
16 # arguments to start executing 3 syscalls (open,read,close) and returning.
17 TESTCMD
="$TESTDIR/utils/testapp/gen-syscall-events/gen-syscall-events"
19 source $TESTDIR/utils
/utils.sh
21 function trace_testapp
()
24 start_file_sync
=$
(mktemp
-u)
26 # Clear all entries from the resource tracker
27 lttng_untrack_kernel_all_ok
29 # Launch the testapp and save its Process ID
30 .
/"$TESTCMD" "$start_file_sync" "/proc/cpuinfo" "/proc/cmdline" &
33 # Set LTTng to track this PID and start the tracing
34 lttng_track_pid_ok
$PID
36 start_lttng_tracing_ok
38 # Create start file to launch the execution of the workload by the
40 touch "$start_file_sync"
46 # Clean up the synchronization file
47 rm -f "$start_file_sync"
50 function validate_list
()
56 out
=$
($TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN list
$session_name $opt |
grep $event_name)
57 if [ -z "$out" ]; then
58 fail
"Validate syscall listing"
59 diag
"$event_name not found when listing $session_name (opt $opt)"
61 pass
"Validate syscall listing. Found $event_name."
65 function test_syscall_event_list
()
67 local EVENT_NAME
="getpid"
69 diag
"Syscall event listing"
71 validate_list
"" $EVENT_NAME "-k --syscall"
74 function test_syscall_simple_list
()
76 TRACE_PATH
=$
(mktemp
-d)
77 SESSION_NAME
="kernel_syscall_simple_list"
78 local EVENT_NAME
="close"
80 diag
"Syscall simple listing"
82 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
84 lttng_enable_kernel_syscall_ok
$SESSION_NAME $EVENT_NAME
86 validate_list
$SESSION_NAME $EVENT_NAME
90 # ensure all events are in the trace.
91 validate_trace_exp
"-e syscall_entry_$EVENT_NAME: -e compat_syscall_entry_$EVENT_NAME:" $TRACE_PATH
92 validate_trace_exp
"-e syscall_exit_$EVENT_NAME: -e compat_syscall_exit_$EVENT_NAME:" $TRACE_PATH
94 # ensure trace only contains those.
95 validate_trace_only_exp
"-e syscall_entry_$EVENT_NAME: -e compat_syscall_entry_$EVENT_NAME: -e syscall_exit_$EVENT_NAME: -e compat_syscall_exit_$EVENT_NAME:" $TRACE_PATH
97 destroy_lttng_session_ok
$SESSION_NAME
102 function test_syscall_simple_list_two
()
104 TRACE_PATH
=$
(mktemp
-d)
105 SESSION_NAME
="kernel_syscall_simple_list_two"
106 local EVENT_NAME
="close"
107 local EVENT_NAME2
="read"
109 diag
"Syscall simple listing"
111 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
113 lttng_enable_kernel_syscall_ok
$SESSION_NAME $EVENT_NAME
114 lttng_enable_kernel_syscall_ok
$SESSION_NAME $EVENT_NAME2
116 validate_list
$SESSION_NAME $EVENT_NAME
117 validate_list
$SESSION_NAME $EVENT_NAME2
121 # ensure all events are in the trace.
122 validate_trace_exp
"-e syscall_entry_$EVENT_NAME: -e compat_syscall_entry_$EVENT_NAME:" $TRACE_PATH
123 validate_trace_exp
"-e syscall_exit_$EVENT_NAME: -e compat_syscall_exit_$EVENT_NAME:" $TRACE_PATH
125 validate_trace_exp
"-e syscall_entry_$EVENT_NAME2: -e compat_syscall_entry_$EVENT_NAME2:" $TRACE_PATH
126 validate_trace_exp
"-e syscall_exit_$EVENT_NAME2: -e compat_syscall_exit_$EVENT_NAME2:" $TRACE_PATH
128 # ensure trace only contains those.
129 validate_trace_only_exp
"-e syscall_entry_$EVENT_NAME: -e compat_syscall_entry_$EVENT_NAME: -e syscall_exit_$EVENT_NAME: -e compat_syscall_exit_$EVENT_NAME: -e syscall_entry_$EVENT_NAME2: -e compat_syscall_entry_$EVENT_NAME2: -e syscall_exit_$EVENT_NAME2: -e compat_syscall_exit_$EVENT_NAME2:" $TRACE_PATH
131 destroy_lttng_session_ok
$SESSION_NAME
136 function test_syscall_single
()
138 TRACE_PATH
=$
(mktemp
-d)
139 SESSION_NAME
="kernel_syscall_single"
141 diag
"Syscall trace single"
143 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
145 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
149 # ensure all events are in the trace.
150 validate_trace_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat:" $TRACE_PATH
151 validate_trace_exp
"-e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
153 # ensure trace only contains those.
154 validate_trace_only_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat: -e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
156 destroy_lttng_session_ok
$SESSION_NAME
161 function test_syscall_two
()
163 TRACE_PATH
=$
(mktemp
-d)
164 SESSION_NAME
="kernel_syscall_two"
166 diag
"Syscall trace two events"
168 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
170 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
171 lttng_enable_kernel_syscall_ok
$SESSION_NAME "close"
175 # ensure all events are in the trace.
176 validate_trace_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat:" $TRACE_PATH
177 validate_trace_exp
"-e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
178 validate_trace_exp
"-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
179 validate_trace_exp
"-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
181 # ensure trace only contains those.
182 validate_trace_only_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat: -e syscall_exit_openat: -e compat_syscall_exit_openat: -e syscall_entry_close: -e compat_syscall_entry_close: -e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
184 destroy_lttng_session_ok
$SESSION_NAME
189 function test_syscall_all
()
191 TRACE_PATH
=$
(mktemp
-d)
192 SESSION_NAME
="kernel_syscall_all"
194 diag
"Syscall trace all events"
196 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
198 # enable all syscalls
199 lttng_enable_kernel_syscall_ok
$SESSION_NAME
203 # ensure at least open and close are there.
204 validate_trace_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat:" $TRACE_PATH
205 validate_trace_exp
"-e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
206 validate_trace_exp
"-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
207 validate_trace_exp
"-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
208 # trace may contain other syscalls.
210 destroy_lttng_session_ok
$SESSION_NAME
215 function test_syscall_all_disable_one
()
217 TRACE_PATH
=$
(mktemp
-d)
218 SESSION_NAME
="kernel_syscall_all_disable_one"
220 diag
"Syscall trace all events and disable one"
222 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
224 # enable all syscalls
225 lttng_enable_kernel_syscall_ok
$SESSION_NAME
226 # try to disable open system call: fails because enabler semantic of
227 # "all syscalls" is not "the open" system call.
228 lttng_disable_kernel_syscall_fail
$SESSION_NAME "openat"
232 # ensure "openat" syscall is there.
233 validate_trace_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat: -e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
235 # ensure "close" syscall is there.
236 validate_trace_exp
"-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
237 validate_trace_exp
"-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
239 destroy_lttng_session_ok
$SESSION_NAME
244 function test_syscall_all_disable_two
()
246 TRACE_PATH
=$
(mktemp
-d)
247 SESSION_NAME
="kernel_syscall_all_disable_two"
249 diag
"Syscall trace all events and disable two"
251 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
253 # enable all syscalls
254 lttng_enable_kernel_syscall_ok
$SESSION_NAME
255 # try to disable open and close system calls: fails because enabler
256 # semantic of "all syscalls" is not "the open" system call.
257 lttng_disable_kernel_syscall_fail
$SESSION_NAME "openat"
258 lttng_disable_kernel_syscall_fail
$SESSION_NAME "close"
262 # ensure "openat" syscall is there.
263 validate_trace_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat: -e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
265 # ensure "close" syscall is there.
266 validate_trace_exp
"-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
267 validate_trace_exp
"-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
269 # ensure "read" syscall is there.
270 validate_trace_exp
"-e syscall_entry_read: -e compat_syscall_entry_read:" $TRACE_PATH
271 validate_trace_exp
"-e syscall_exit_read: -e compat_syscall_exit_read:" $TRACE_PATH
273 destroy_lttng_session_ok
$SESSION_NAME
278 function test_syscall_enable_all_disable_all
()
280 TRACE_PATH
=$
(mktemp
-d)
281 SESSION_NAME
="kernel_syscall_enable_all_disable_all"
283 diag
"Syscall trace all events and disable all"
285 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
287 # enable all system calls
288 lttng_enable_kernel_syscall_ok
$SESSION_NAME
289 # disable all system calls
290 lttng_disable_kernel_syscall_ok
$SESSION_NAME
294 # ensure nothing has been traced.
295 validate_trace_empty
$TRACE_PATH
297 destroy_lttng_session_ok
$SESSION_NAME
302 function test_syscall_enable_all_disable_all_enable_all
()
304 TRACE_PATH
=$
(mktemp
-d)
305 SESSION_NAME
="kernel_syscall_enable_all_disable_all_enable_all"
307 diag
"Syscall trace all events and enable/disable all"
309 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
311 # enable all system calls
312 lttng_enable_kernel_syscall_ok
$SESSION_NAME
313 # disable all system calls
314 lttng_disable_kernel_syscall_ok
$SESSION_NAME
315 # enable all system calls
316 lttng_enable_kernel_syscall_ok
$SESSION_NAME
320 # ensure at least open and close are there.
321 validate_trace_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat:" $TRACE_PATH
322 validate_trace_exp
"-e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
323 validate_trace_exp
"-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
324 validate_trace_exp
"-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
325 # trace may contain other syscalls.
327 destroy_lttng_session_ok
$SESSION_NAME
332 function test_syscall_enable_all_enable_one_disable_all
()
334 TRACE_PATH
=$
(mktemp
-d)
335 SESSION_NAME
="kernel_syscall_enable_all_enable_one_disable_all"
337 diag
"Syscall trace all events, enable one and disable all"
339 create_lttng_session_ok
$SESSION_NAME "$TRACE_PATH"
341 # enable all syscalls
342 lttng_enable_kernel_syscall_ok
$SESSION_NAME
344 # enable one specific syscall, "openat"
345 lttng_enable_kernel_syscall_ok
$SESSION_NAME openat
347 # disable all syscalls
348 lttng_disable_kernel_syscall_ok
$SESSION_NAME
352 # The trace shouldn't contain any syscalls, disable-all should disable
353 # even individually specified syscalls
354 trace_match_only openat
0 "$TRACE_PATH"
356 destroy_lttng_session_ok
$SESSION_NAME
361 function test_syscall_enable_one_enable_all_disable_one
()
363 TRACE_PATH
=$
(mktemp
-d)
364 SESSION_NAME
="kernel_syscall_enable_one_enable_all_disable_one"
366 diag
"Syscall trace all events and enable/disable one"
368 create_lttng_session_ok
$SESSION_NAME "$TRACE_PATH"
370 # enable one specific syscall, "openat"
371 lttng_enable_kernel_syscall_ok
$SESSION_NAME openat
373 # enable all syscalls
374 lttng_enable_kernel_syscall_ok
$SESSION_NAME
376 # disable one specific syscall, "openat"
377 lttng_disable_kernel_syscall_ok
$SESSION_NAME openat
381 # The trace should contain all syscalls, including 'openat' because
382 # enable-all overrides individually disabled syscalls.
383 validate_trace openat
"$TRACE_PATH"
385 destroy_lttng_session_ok
$SESSION_NAME
390 function test_syscall_enable_one_enable_all_disable_all_disable_one
()
392 TRACE_PATH
=$
(mktemp
-d)
393 SESSION_NAME
="kernel_syscall_enable_one_enable_all_disable_all_disable_one"
395 diag
"Syscall trace all events and enable/disable one"
397 create_lttng_session_ok
$SESSION_NAME "$TRACE_PATH"
399 # enable one specific syscall, "openat"
400 lttng_enable_kernel_syscall_ok
$SESSION_NAME openat
402 # enable all syscalls
403 lttng_enable_kernel_syscall_ok
$SESSION_NAME
405 # disable all syscalls
406 lttng_disable_kernel_syscall_ok
$SESSION_NAME
408 # disable one specific syscall, "openat"
409 lttng_disable_kernel_syscall_ok
$SESSION_NAME openat
413 # The trace shouldn't contain any syscalls, disable-all should disable
414 # even individually specified syscalls
415 trace_match_only openat
0 "$TRACE_PATH"
417 destroy_lttng_session_ok
$SESSION_NAME
422 function test_syscall_enable_all_disable_all_twice
()
424 TRACE_PATH
=$
(mktemp
-d)
425 SESSION_NAME
="kernel_syscall_enable_all_disable_all_twice"
427 diag
"Syscall trace all events and enable/disable all twice"
429 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
431 # enable all system calls
432 lttng_enable_kernel_syscall_ok
$SESSION_NAME
433 # disable all system calls
434 lttng_disable_kernel_syscall_ok
$SESSION_NAME
435 # enable all system calls
436 lttng_enable_kernel_syscall_ok
$SESSION_NAME
437 # disable all system calls
438 lttng_disable_kernel_syscall_ok
$SESSION_NAME
442 # ensure nothing has been traced.
443 validate_trace_empty
$TRACE_PATH
445 destroy_lttng_session_ok
$SESSION_NAME
450 function test_syscall_enable_one_disable_one
()
452 TRACE_PATH
=$
(mktemp
-d)
453 SESSION_NAME
="kernel_syscall_enable_one_disable_one"
455 diag
"Syscall trace one event and disable one"
457 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
459 # enable open system call
460 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
461 # disable open system call
462 lttng_disable_kernel_syscall_ok
$SESSION_NAME "openat"
466 # ensure nothing has been traced.
467 validate_trace_empty
$TRACE_PATH
469 destroy_lttng_session_ok
$SESSION_NAME
474 function test_syscall_enable_two_disable_two
()
476 TRACE_PATH
=$
(mktemp
-d)
477 SESSION_NAME
="kernel_syscall_enable_two_disable_two"
479 diag
"Syscall trace two events and disable two"
481 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
483 # enable open and close system calls
484 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
485 lttng_enable_kernel_syscall_ok
$SESSION_NAME "close"
486 # disable open and close system calls
487 lttng_disable_kernel_syscall_ok
$SESSION_NAME "openat"
488 lttng_disable_kernel_syscall_ok
$SESSION_NAME "close"
492 # ensure nothing has been traced.
493 validate_trace_empty
$TRACE_PATH
495 destroy_lttng_session_ok
$SESSION_NAME
500 function test_syscall_enable_two_disable_one
()
502 TRACE_PATH
=$
(mktemp
-d)
503 SESSION_NAME
="kernel_syscall_enable_two_disable_one"
505 diag
"Syscall trace two events and disable one"
507 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
509 # enable open and close system calls
510 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
511 lttng_enable_kernel_syscall_ok
$SESSION_NAME "close"
512 # disable close system call
513 lttng_disable_kernel_syscall_ok
$SESSION_NAME "close"
517 # ensure open is there.
518 validate_trace_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat:" $TRACE_PATH
519 validate_trace_exp
"-e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
521 # ensure trace only contains those.
522 validate_trace_only_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat: -e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
524 destroy_lttng_session_ok
$SESSION_NAME
529 function test_syscall_disable_twice
()
531 TRACE_PATH
=$
(mktemp
-d)
532 SESSION_NAME
="kernel_syscall_disable_twice"
534 diag
"Syscall trace one event and disable twice"
536 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
538 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
539 # First disable will succeed
540 lttng_disable_kernel_syscall_ok
$SESSION_NAME "openat"
541 # Second disable succeeds too, due to enabler semantic.
542 lttng_disable_kernel_syscall_ok
$SESSION_NAME "openat"
544 destroy_lttng_session_ok
$SESSION_NAME
549 function test_syscall_disable_all_twice
()
551 TRACE_PATH
=$
(mktemp
-d)
552 SESSION_NAME
="kernel_syscall_disable_all_twice"
554 diag
"Syscall trace all events and disable all twice"
556 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
558 lttng_enable_kernel_syscall_ok
$SESSION_NAME
559 # First disable will succeed
560 lttng_disable_kernel_syscall_ok
$SESSION_NAME
561 # Second disable succeeds too, due to enabler semantic.
562 lttng_disable_kernel_syscall_ok
$SESSION_NAME
564 destroy_lttng_session_ok
$SESSION_NAME
570 function test_syscall_enable_unknown
()
572 TRACE_PATH
=$
(mktemp
-d)
573 SESSION_NAME
="kernel_syscall_enable_unknown"
575 diag
"Syscall enable an unknown event"
577 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
579 # Enabling a syscall that does not exist succeeds, due to enabler
581 lttng_enable_kernel_syscall_ok
$SESSION_NAME "thissyscallcannotexist"
583 destroy_lttng_session_ok
$SESSION_NAME
588 function test_syscall_enable_all_enable_one
()
590 TRACE_PATH
=$
(mktemp
-d)
591 SESSION_NAME
="kernel_syscall_enable_all_enable_one"
593 diag
"Syscall enable all and enable one"
595 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
597 lttng_enable_kernel_syscall_ok
$SESSION_NAME
598 # Enabling an event already enabled succeeds, due to enabler semantic.
599 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
601 destroy_lttng_session_ok
$SESSION_NAME
606 function test_syscall_disable_all_disable_one
()
608 TRACE_PATH
=$
(mktemp
-d)
609 SESSION_NAME
="kernel_syscall_enable_all_enable_one"
611 diag
"Syscall disable all and disable one"
613 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
615 lttng_enable_kernel_syscall_ok
$SESSION_NAME
616 lttng_disable_kernel_syscall_ok
$SESSION_NAME
617 # Disabling an event already disabled fails.
618 lttng_disable_kernel_syscall_fail
$SESSION_NAME "openat"
620 destroy_lttng_session_ok
$SESSION_NAME
625 function test_syscall_enable_channel_disable_all
()
627 TRACE_PATH
=$
(mktemp
-d)
628 SESSION_NAME
="kernel_syscall_enable_channel_disable_all"
629 CHANNEL_NAME
="channel"
631 diag
"Syscall enable channel and disable all"
633 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
635 lttng_enable_kernel_channel_ok
$SESSION_NAME $CHANNEL_NAME
636 # sessiond semantic for "disable all" is to try to match all enalers
637 # it knowns about. Disable all succeeds if it finds no match.
638 lttng_disable_kernel_syscall_ok
$SESSION_NAME "-a" $CHANNEL_NAME
640 destroy_lttng_session_ok
$SESSION_NAME
645 function test_syscall_enable_channel_disable_one
()
647 TRACE_PATH
=$
(mktemp
-d)
648 SESSION_NAME
="kernel_syscall_enable_channel_disable_all"
649 CHANNEL_NAME
="channel"
651 diag
"Syscall enable channel and disable one"
653 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
655 lttng_enable_kernel_channel_ok
$SESSION_NAME $CHANNEL_NAME
656 lttng_disable_kernel_syscall_fail
$SESSION_NAME "openat" $CHANNEL_NAME
658 destroy_lttng_session_ok
$SESSION_NAME
663 # MUST set TESTDIR before calling those functions
664 plan_tests
$NUM_TESTS
666 print_test_banner
"$TEST_DESC"
668 if [ "$(id -u)" == "0" ]; then
674 skip
$isroot "Root access is needed. Skipping all tests." $NUM_TESTS ||
678 test_syscall_event_list
679 test_syscall_simple_list
680 test_syscall_simple_list_two
684 test_syscall_all_disable_one
685 test_syscall_all_disable_two
686 test_syscall_enable_all_disable_all
687 test_syscall_enable_all_disable_all_enable_all
688 test_syscall_enable_all_disable_all_twice
689 test_syscall_enable_all_enable_one_disable_all
690 test_syscall_enable_one_enable_all_disable_one
691 test_syscall_enable_one_enable_all_disable_all_disable_one
692 test_syscall_enable_one_disable_one
693 test_syscall_enable_two_disable_two
694 test_syscall_enable_two_disable_one
695 test_syscall_disable_twice
696 test_syscall_disable_all_twice
697 test_syscall_enable_unknown
698 test_syscall_enable_all_enable_one
699 test_syscall_disable_all_disable_one
700 test_syscall_enable_channel_disable_all
701 test_syscall_enable_channel_disable_one