summaryrefslogtreecommitdiff
path: root/tests/detach-stopped.test
diff options
context:
space:
mode:
Diffstat (limited to 'tests/detach-stopped.test')
-rwxr-xr-xtests/detach-stopped.test66
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/detach-stopped.test b/tests/detach-stopped.test
new file mode 100755
index 0000000..81fd303
--- /dev/null
+++ b/tests/detach-stopped.test
@@ -0,0 +1,66 @@
+#!/bin/sh
+
+# Ensure that strace can detach from stopped processes.
+
+. "${srcdir=.}/init.sh"
+
+check_prog sleep
+check_prog grep
+
+set -e
+
+rm -f $LOG
+./set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > $LOG &
+
+while ! [ -s $LOG ]; do
+ kill -0 $! 2> /dev/null ||
+ fail_ 'set_ptracer_any sleep failed'
+ $SLEEP_A_BIT
+done
+
+tracee_pid=$!
+kill -STOP $tracee_pid
+
+cleanup()
+{
+ set +e
+ kill $tracee_pid
+ kill -CONT $tracee_pid
+ wait $tracee_pid 2> /dev/null
+}
+
+rm -f $LOG
+$STRACE -p $tracee_pid 2> $LOG &
+
+while ! grep -F "Process $tracee_pid attached" $LOG > /dev/null; do
+ kill -0 $! 2> /dev/null ||
+ { cat $LOG; cleanup; fail_ 'strace -p does not work'; }
+ $SLEEP_A_BIT
+done
+
+while ! grep -F -e '--- stopped by ' $LOG > /dev/null; do
+ kill -0 $! 2> /dev/null ||
+ { cat $LOG; cleanup; fail_ 'strace -p does not work'; }
+ $SLEEP_A_BIT
+done
+
+kill -INT $!
+wait $!
+
+grep -F "Process $tracee_pid detached" $LOG > /dev/null ||
+ { cat $LOG; cleanup; fail_ 'strace -p failed to detach'; }
+
+if [ -f /proc/self/status ]; then
+ $SLEEP_A_BIT
+ test -d /proc/$tracee_pid ||
+ { cat $LOG; cleanup; fail_ 'tracee died after detach'; }
+ grep '^State:.*T (stopped)' < /proc/$tracee_pid/status > /dev/null || {
+ cat $LOG
+ grep '^State:' < /proc/$tracee_pid/status
+ cleanup
+ fail_ 'tracee is not group-stopped after detach'
+ }
+fi
+
+cleanup
+exit 0