| """Test GDB's follow-fork-mode child. |
| |
| SPDX-License-Identifier: GPL-2.0-or-later |
| """ |
| from test_gdbstub import main, report |
| |
| |
| def run_test(): |
| """Run through the tests one by one""" |
| gdb.execute("set follow-fork-mode child") |
| # Check that the parent breakpoints are unset. |
| gdb.execute("break break_after_fork") |
| # Check that the parent syscall catchpoints are unset. |
| # Skip this check on the architectures that don't have them. |
| have_fork_syscall = False |
| for fork_syscall in ("fork", "clone", "clone2", "clone3"): |
| try: |
| gdb.execute("catch syscall {}".format(fork_syscall)) |
| except gdb.error: |
| pass |
| else: |
| have_fork_syscall = True |
| gdb.execute("continue") |
| for i in range(42): |
| if have_fork_syscall: |
| # syscall entry. |
| if i % 2 == 0: |
| # Check that the parent single-stepping is turned off. |
| gdb.execute("si") |
| else: |
| gdb.execute("continue") |
| # syscall exit. |
| gdb.execute("continue") |
| # break_after_fork() |
| gdb.execute("continue") |
| exitcode = int(gdb.parse_and_eval("$_exitcode")) |
| report(exitcode == 42, "{} == 42".format(exitcode)) |
| |
| |
| main(run_test) |