| source `dirname $0`/util.sh |
| |
| NEST_EXE=nested_detach_wait |
| SLEEP_EXE=term_trace_syscall |
| SYNC_TOKEN=sleeping |
| WAIT_SECS=1 |
| |
| mkdir $workdir/inner |
| RECORD_ARGS="--env=_RR_TRACE_DIR=$workdir/inner" |
| save_exe "$NEST_EXE" |
| save_exe "$SLEEP_EXE" |
| touch record.out |
| just_record $NEST_EXE-$nonce "$(which rr) record --nested=detach $PWD/$SLEEP_EXE-$nonce" & |
| SUB_ID=$! |
| |
| echo "Waiting for token '$SYNC_TOKEN' from tracee ..." |
| until grep -q $SYNC_TOKEN record.out; do |
| sleep 0 |
| if ! kill -0 "$SUB_ID" >/dev/null 2>&1; then failed "subshell died, no need to longer wait for '$SYNC_TOKEN'"; exit; fi |
| done |
| |
| sleep_pid=$(pidof $SLEEP_EXE-$nonce) |
| nested_rr_pid=$(parent_pid_of $sleep_pid) |
| echo " done. Delivering SIGSTOP to nested rr $nested_rr_pid ..." |
| kill -STOP $nested_rr_pid |
| # Sleep a bit because if we issue the CONT immediately rr doesn't even notice |
| sleep 1 |
| echo " done. Delivering SIGCONT to nested rr $nested_rr_pid ..." |
| kill -CONT $nested_rr_pid |
| |
| echo " done. Delivering SIGTERM to sleeping $sleep_pid ..." |
| kill -TERM $sleep_pid |
| |
| # Wait for 'record' to actually terminate. |
| wait $SUB_ID || failed "Recording failed: $?" |
| |
| # Replay outer |
| replay |
| # Replay inner |
| cd $workdir/inner |
| workdir_orig=$workdir |
| workdir=$PWD |
| wait_for_complete |
| replay |
| check_replay_token $SYNC_TOKEN |
| workdir=$workdir_orig |