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" &
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_disable_all_twice
()
334 TRACE_PATH
=$
(mktemp
-d)
335 SESSION_NAME
="kernel_syscall_enable_all_disable_all_twice"
337 diag
"Syscall trace all events and enable/disable all twice"
339 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
341 # enable all system calls
342 lttng_enable_kernel_syscall_ok
$SESSION_NAME
343 # disable all system calls
344 lttng_disable_kernel_syscall_ok
$SESSION_NAME
345 # enable all system calls
346 lttng_enable_kernel_syscall_ok
$SESSION_NAME
347 # disable all system calls
348 lttng_disable_kernel_syscall_ok
$SESSION_NAME
352 # ensure nothing has been traced.
353 validate_trace_empty
$TRACE_PATH
355 destroy_lttng_session_ok
$SESSION_NAME
360 function test_syscall_enable_one_disable_one
()
362 TRACE_PATH
=$
(mktemp
-d)
363 SESSION_NAME
="kernel_syscall_enable_one_disable_one"
365 diag
"Syscall trace one event and disable one"
367 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
369 # enable open system call
370 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
371 # disable open system call
372 lttng_disable_kernel_syscall_ok
$SESSION_NAME "openat"
376 # ensure nothing has been traced.
377 validate_trace_empty
$TRACE_PATH
379 destroy_lttng_session_ok
$SESSION_NAME
384 function test_syscall_enable_two_disable_two
()
386 TRACE_PATH
=$
(mktemp
-d)
387 SESSION_NAME
="kernel_syscall_enable_two_disable_two"
389 diag
"Syscall trace two events and disable two"
391 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
393 # enable open and close system calls
394 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
395 lttng_enable_kernel_syscall_ok
$SESSION_NAME "close"
396 # disable open and close system calls
397 lttng_disable_kernel_syscall_ok
$SESSION_NAME "openat"
398 lttng_disable_kernel_syscall_ok
$SESSION_NAME "close"
402 # ensure nothing has been traced.
403 validate_trace_empty
$TRACE_PATH
405 destroy_lttng_session_ok
$SESSION_NAME
410 function test_syscall_enable_two_disable_one
()
412 TRACE_PATH
=$
(mktemp
-d)
413 SESSION_NAME
="kernel_syscall_enable_two_disable_one"
415 diag
"Syscall trace two events and disable one"
417 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
419 # enable open and close system calls
420 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
421 lttng_enable_kernel_syscall_ok
$SESSION_NAME "close"
422 # disable close system call
423 lttng_disable_kernel_syscall_ok
$SESSION_NAME "close"
427 # ensure open is there.
428 validate_trace_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat:" $TRACE_PATH
429 validate_trace_exp
"-e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
431 # ensure trace only contains those.
432 validate_trace_only_exp
"-e syscall_entry_openat: -e compat_syscall_entry_openat: -e syscall_exit_openat: -e compat_syscall_exit_openat:" $TRACE_PATH
434 destroy_lttng_session_ok
$SESSION_NAME
439 function test_syscall_disable_twice
()
441 TRACE_PATH
=$
(mktemp
-d)
442 SESSION_NAME
="kernel_syscall_disable_twice"
444 diag
"Syscall trace one event and disable twice"
446 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
448 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
449 # First disable will succeed
450 lttng_disable_kernel_syscall_ok
$SESSION_NAME "openat"
451 # Second disable succeeds too, due to enabler semantic.
452 lttng_disable_kernel_syscall_ok
$SESSION_NAME "openat"
454 destroy_lttng_session_ok
$SESSION_NAME
459 function test_syscall_disable_all_twice
()
461 TRACE_PATH
=$
(mktemp
-d)
462 SESSION_NAME
="kernel_syscall_disable_all_twice"
464 diag
"Syscall trace all events and disable all twice"
466 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
468 lttng_enable_kernel_syscall_ok
$SESSION_NAME
469 # First disable will succeed
470 lttng_disable_kernel_syscall_ok
$SESSION_NAME
471 # Second disable succeeds too, due to enabler semantic.
472 lttng_disable_kernel_syscall_ok
$SESSION_NAME
474 destroy_lttng_session_ok
$SESSION_NAME
480 function test_syscall_enable_unknown
()
482 TRACE_PATH
=$
(mktemp
-d)
483 SESSION_NAME
="kernel_syscall_enable_unknown"
485 diag
"Syscall enable an unknown event"
487 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
489 # Enabling a syscall that does not exist succeeds, due to enabler
491 lttng_enable_kernel_syscall_ok
$SESSION_NAME "thissyscallcannotexist"
493 destroy_lttng_session_ok
$SESSION_NAME
498 function test_syscall_enable_all_enable_one
()
500 TRACE_PATH
=$
(mktemp
-d)
501 SESSION_NAME
="kernel_syscall_enable_all_enable_one"
503 diag
"Syscall enable all and enable one"
505 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
507 lttng_enable_kernel_syscall_ok
$SESSION_NAME
508 # Enabling an event already enabled succeeds, due to enabler semantic.
509 lttng_enable_kernel_syscall_ok
$SESSION_NAME "openat"
511 destroy_lttng_session_ok
$SESSION_NAME
516 function test_syscall_disable_all_disable_one
()
518 TRACE_PATH
=$
(mktemp
-d)
519 SESSION_NAME
="kernel_syscall_enable_all_enable_one"
521 diag
"Syscall disable all and disable one"
523 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
525 lttng_enable_kernel_syscall_ok
$SESSION_NAME
526 lttng_disable_kernel_syscall_ok
$SESSION_NAME
527 # Disabling an event already disabled fails.
528 lttng_disable_kernel_syscall_fail
$SESSION_NAME "openat"
530 destroy_lttng_session_ok
$SESSION_NAME
535 function test_syscall_enable_channel_disable_all
()
537 TRACE_PATH
=$
(mktemp
-d)
538 SESSION_NAME
="kernel_syscall_enable_channel_disable_all"
539 CHANNEL_NAME
="channel"
541 diag
"Syscall enable channel and disable all"
543 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
545 lttng_enable_kernel_channel_ok
$SESSION_NAME $CHANNEL_NAME
546 # sessiond semantic for "disable all" is to try to match all enalers
547 # it knowns about. Disable all succeeds if it finds no match.
548 lttng_disable_kernel_syscall_ok
$SESSION_NAME "-a" $CHANNEL_NAME
550 destroy_lttng_session_ok
$SESSION_NAME
555 function test_syscall_enable_channel_disable_one
()
557 TRACE_PATH
=$
(mktemp
-d)
558 SESSION_NAME
="kernel_syscall_enable_channel_disable_all"
559 CHANNEL_NAME
="channel"
561 diag
"Syscall enable channel and disable one"
563 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
565 lttng_enable_kernel_channel_ok
$SESSION_NAME $CHANNEL_NAME
566 lttng_disable_kernel_syscall_fail
$SESSION_NAME "openat" $CHANNEL_NAME
568 destroy_lttng_session_ok
$SESSION_NAME
573 # MUST set TESTDIR before calling those functions
574 plan_tests
$NUM_TESTS
576 print_test_banner
"$TEST_DESC"
578 if [ "$(id -u)" == "0" ]; then
584 skip
$isroot "Root access is needed. Skipping all tests." $NUM_TESTS ||
588 test_syscall_event_list
589 test_syscall_simple_list
590 test_syscall_simple_list_two
594 test_syscall_all_disable_one
595 test_syscall_all_disable_two
596 test_syscall_enable_all_disable_all
597 test_syscall_enable_all_disable_all_enable_all
598 test_syscall_enable_all_disable_all_twice
599 test_syscall_enable_one_disable_one
600 test_syscall_enable_two_disable_two
601 test_syscall_enable_two_disable_one
602 test_syscall_disable_twice
603 test_syscall_disable_all_twice
604 test_syscall_enable_unknown
605 test_syscall_enable_all_enable_one
606 test_syscall_disable_all_disable_one
607 test_syscall_enable_channel_disable_all
608 test_syscall_enable_channel_disable_one