blob: a8537a2507be168f12b1e6c4811c3994feee141d [file] [log] [blame]
#!/bin/sh
# Check -i option.
. "${srcdir=.}/init.sh"
check_prog grep
OUT="$LOG.out"
./pc > /dev/null ||
framework_skip_ 'munmap/fork/wait do not behave as expected'
args="-if ./pc"
$STRACE $args > "$OUT" 2> "$LOG" || {
cat "$LOG"
fail_ "$STRACE $args does not work"
}
len="$(sed -n 's/^\[[[:xdigit:]]\+\] write(-1, NULL, \([[:digit:]]\{1,2\}\))[[:space:]]\+= -1 .*/\1/p' "$LOG")" &&
[ -n "$len" ] &&
pid="$(sed -n 's/^\[[[:xdigit:]]\{'"$len"'\}\] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_\(KILLED\|DUMPED\), si_pid=\([[:digit:]]\+\), .*/\2/p' "$LOG")" &&
[ -n "$pid" ] &&
ip="$(sed -n 's/^\[pid \+'"$pid"'\] \[\([[:xdigit:]]\{'"$len"'\}\)] --- SIGSEGV {.*} ---$/\1/p' "$LOG")" &&
[ -n "$ip" ] &&
addr="$(echo "$ip" |sed 's/^0\+//')" &&
[ -n "$addr" ] || {
cat "$OUT" "$LOG"
fail_ "$STRACE $args output mismatch"
}
grep_log()
{
LC_ALL=C grep -x -e "$*" < "$LOG" > /dev/null || {
cat "$OUT" "$LOG"
fail_ "$STRACE $args output mismatch"
}
}
grep_log '\[[[:xdigit:]]\{'"$len"'\}\] munmap(0x[[:xdigit:]]\+, 0)[[:space:]]\+= -1 .*'
grep_log '\[pid \+'"$pid"'\] \['"$ip"'\] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x'"$addr"'} ---'
grep_log '\[pid \+'"$pid"'\] \[?\{'"$len"'\}\] +++ killed by SIGSEGV\( (core dumped)\)\? +++'
grep_log '\[?\{'"$len"'\}\] +++ exited with 0 +++'
rm -f "$OUT"
exit 0