15dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#!/bin/sh 25dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 35dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes# Ensure that strace can detach from sleeping processes. 45dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 55dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes. "${srcdir=.}/init.sh" 65dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 75dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughescheck_prog sleep 85dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughescheck_prog grep 95dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 105dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesset -e 115dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 125dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesrm -f $LOG 135dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes./set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > $LOG & 145dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 155dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheswhile ! [ -s $LOG ]; do 165dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes kill -0 $! 2> /dev/null || 175dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes fail_ 'set_ptracer_any sleep failed' 185dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes $SLEEP_A_BIT 195dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesdone 205dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 215dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughestracee_pid=$! 225dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 235dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughescleanup() 245dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes{ 255dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes set +e 265dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes kill $tracee_pid 275dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes wait $tracee_pid 2> /dev/null 285dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes} 295dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 305dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesrm -f $LOG 315dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes$STRACE -p $tracee_pid 2> $LOG & 325dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 335dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheswhile ! grep -F "Process $tracee_pid attached" $LOG > /dev/null; do 345dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes kill -0 $! 2> /dev/null || 355dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes { cat $LOG; cleanup; fail_ 'strace -p does not work'; } 365dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes $SLEEP_A_BIT 375dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesdone 385dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 395dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheskill -INT $! 405dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheswait $! 415dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 425dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesgrep -F "Process $tracee_pid detached" $LOG > /dev/null || 435dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes { cat $LOG; cleanup; fail_ 'strace -p failed to detach'; } 445dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 455dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesif [ -f /proc/self/status ]; then 465dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes $SLEEP_A_BIT 475dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes test -d /proc/$tracee_pid || 485dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes { cat $LOG; cleanup; fail_ 'tracee died after detach'; } 495dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes grep '^State:.*S (sleeping)' < /proc/$tracee_pid/status > /dev/null || { 505dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes cat $LOG 515dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes grep '^State:' < /proc/$tracee_pid/status 525dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes cleanup 535dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes fail_ 'tracee is not sleeping after detach' 545dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes } 555dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesfi 565dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 575dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughescleanup 585dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesexit 0 59