1#!/bin/sh 2 3# Ensure that strace can detach from running processes. 4 5. "${srcdir=.}/init.sh" 6 7check_prog sleep 8check_prog grep 9 10set -e 11 12./set_ptracer_any sh -c "echo > $LOG; while :; do :; done" > /dev/null & 13 14while ! [ -s $LOG ]; do 15 kill -0 $! 2> /dev/null || 16 fail_ 'set_ptracer_any sh failed' 17 $SLEEP_A_BIT 18done 19 20tracee_pid=$! 21 22cleanup() 23{ 24 set +e 25 kill $tracee_pid 26 wait $tracee_pid 2> /dev/null 27} 28 29rm -f $LOG 30$STRACE -p $tracee_pid 2> $LOG & 31 32while ! grep -F "Process $tracee_pid attached" $LOG > /dev/null; do 33 kill -0 $! 2> /dev/null || 34 { cat $LOG; cleanup; fail_ 'strace -p does not work'; } 35 $SLEEP_A_BIT 36done 37 38kill -INT $! 39wait $! 40 41grep -F "Process $tracee_pid detached" $LOG > /dev/null || 42 { cat $LOG; cleanup; fail_ 'strace -p failed to detach'; } 43 44if [ -f /proc/self/status ]; then 45 $SLEEP_A_BIT 46 test -d /proc/$tracee_pid || 47 { cat $LOG; cleanup; fail_ 'tracee died after detach'; } 48 grep '^State:.*R (running)' < /proc/$tracee_pid/status > /dev/null || { 49 cat $LOG 50 grep '^State:' < /proc/$tracee_pid/status 51 cleanup 52 fail_ 'tracee is not running after detach' 53 } 54fi 55 56cleanup 57exit 0 58