1*b9504c9aSIlya Leoshkevich"""Test GDB's follow-fork-mode child. 2*b9504c9aSIlya Leoshkevich 3*b9504c9aSIlya LeoshkevichSPDX-License-Identifier: GPL-2.0-or-later 4*b9504c9aSIlya Leoshkevich""" 5*b9504c9aSIlya Leoshkevichfrom test_gdbstub import main, report 6*b9504c9aSIlya Leoshkevich 7*b9504c9aSIlya Leoshkevich 8*b9504c9aSIlya Leoshkevichdef run_test(): 9*b9504c9aSIlya Leoshkevich """Run through the tests one by one""" 10*b9504c9aSIlya Leoshkevich gdb.execute("set follow-fork-mode child") 11*b9504c9aSIlya Leoshkevich # Check that the parent breakpoints are unset. 12*b9504c9aSIlya Leoshkevich gdb.execute("break break_after_fork") 13*b9504c9aSIlya Leoshkevich # Check that the parent syscall catchpoints are unset. 14*b9504c9aSIlya Leoshkevich # Skip this check on the architectures that don't have them. 15*b9504c9aSIlya Leoshkevich have_fork_syscall = False 16*b9504c9aSIlya Leoshkevich for fork_syscall in ("fork", "clone", "clone2", "clone3"): 17*b9504c9aSIlya Leoshkevich try: 18*b9504c9aSIlya Leoshkevich gdb.execute("catch syscall {}".format(fork_syscall)) 19*b9504c9aSIlya Leoshkevich except gdb.error: 20*b9504c9aSIlya Leoshkevich pass 21*b9504c9aSIlya Leoshkevich else: 22*b9504c9aSIlya Leoshkevich have_fork_syscall = True 23*b9504c9aSIlya Leoshkevich gdb.execute("continue") 24*b9504c9aSIlya Leoshkevich for i in range(42): 25*b9504c9aSIlya Leoshkevich if have_fork_syscall: 26*b9504c9aSIlya Leoshkevich # syscall entry. 27*b9504c9aSIlya Leoshkevich if i % 2 == 0: 28*b9504c9aSIlya Leoshkevich # Check that the parent single-stepping is turned off. 29*b9504c9aSIlya Leoshkevich gdb.execute("si") 30*b9504c9aSIlya Leoshkevich else: 31*b9504c9aSIlya Leoshkevich gdb.execute("continue") 32*b9504c9aSIlya Leoshkevich # syscall exit. 33*b9504c9aSIlya Leoshkevich gdb.execute("continue") 34*b9504c9aSIlya Leoshkevich # break_after_fork() 35*b9504c9aSIlya Leoshkevich gdb.execute("continue") 36*b9504c9aSIlya Leoshkevich exitcode = int(gdb.parse_and_eval("$_exitcode")) 37*b9504c9aSIlya Leoshkevich report(exitcode == 42, "{} == 42".format(exitcode)) 38*b9504c9aSIlya Leoshkevich 39*b9504c9aSIlya Leoshkevich 40*b9504c9aSIlya Leoshkevichmain(run_test) 41