"""Test GDB syscall catchpoints. SPDX-License-Identifier: GPL-2.0-or-later """ from test_gdbstub import main, report def check_state(expected): """Check the catch_syscalls_state value""" actual = gdb.parse_and_eval("catch_syscalls_state").string() report(actual == expected, "{} == {}".format(actual, expected)) def run_test(): """Run through the tests one by one""" gdb.Breakpoint("main") gdb.execute("continue") # Check that GDB stops for pipe2/read calls/returns, but not for write. gdb.execute("delete") try: gdb.execute("catch syscall pipe2 read") except gdb.error as exc: exc_str = str(exc) if "not supported on this architecture" in exc_str: print("SKIP: {}".format(exc_str)) return raise for _ in range(2): gdb.execute("continue") check_state("pipe2") for _ in range(2): gdb.execute("continue") check_state("read") # Check that deletion works. gdb.execute("delete") gdb.Breakpoint("end_of_main") gdb.execute("continue") check_state("end") # Check that catch-all works (libc should at least call exit). gdb.execute("delete") gdb.execute("catch syscall") gdb.execute("continue") gdb.execute("delete") gdb.execute("continue") exitcode = int(gdb.parse_and_eval("$_exitcode")) report(exitcode == 0, "{} == 0".format(exitcode)) main(run_test)