|
@@ -14,35 +14,40 @@ libc=$(grep -w libc /proc/self/maps | head -1 | sed -r 's/.*[[:space:]](\/.*)/\1
|
|
|
nm -Dg $libc 2>/dev/null | fgrep -q inet_pton || exit 254
|
|
|
|
|
|
trace_libc_inet_pton_backtrace() {
|
|
|
- idx=0
|
|
|
- expected[0]="ping[][0-9 \.:]+probe_libc:inet_pton: \([[:xdigit:]]+\)"
|
|
|
- expected[1]=".*inet_pton\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$"
|
|
|
+
|
|
|
+ expected=`mktemp -u /tmp/expected.XXX`
|
|
|
+
|
|
|
+ echo "ping[][0-9 \.:]+probe_libc:inet_pton: \([[:xdigit:]]+\)" > $expected
|
|
|
+ echo ".*inet_pton\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
|
|
|
case "$(uname -m)" in
|
|
|
s390x)
|
|
|
eventattr='call-graph=dwarf,max-stack=4'
|
|
|
- expected[2]="gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$"
|
|
|
- expected[3]="(__GI_)?getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$"
|
|
|
- expected[4]="main\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$"
|
|
|
+ echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
|
|
|
+ echo "(__GI_)?getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
|
|
|
+ echo "main\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected
|
|
|
;;
|
|
|
*)
|
|
|
eventattr='max-stack=3'
|
|
|
- expected[2]="getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$"
|
|
|
- expected[3]=".*\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$"
|
|
|
+ echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
|
|
|
+ echo ".*\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected
|
|
|
;;
|
|
|
esac
|
|
|
|
|
|
- file=`mktemp -u /tmp/perf.data.XXX`
|
|
|
+ perf_data=`mktemp -u /tmp/perf.data.XXX`
|
|
|
+ perf_script=`mktemp -u /tmp/perf.script.XXX`
|
|
|
+ perf record -e probe_libc:inet_pton/$eventattr/ -o $perf_data ping -6 -c 1 ::1 > /dev/null 2>&1
|
|
|
+ perf script -i $perf_data > $perf_script
|
|
|
|
|
|
- perf record -e probe_libc:inet_pton/$eventattr/ -o $file ping -6 -c 1 ::1 > /dev/null 2>&1
|
|
|
- perf script -i $file | while read line ; do
|
|
|
+ exec 3<$perf_script
|
|
|
+ exec 4<$expected
|
|
|
+ while read line <&3 && read -r pattern <&4; do
|
|
|
+ [ -z "$pattern" ] && break
|
|
|
echo $line
|
|
|
- echo "$line" | egrep -q "${expected[$idx]}"
|
|
|
+ echo "$line" | egrep -q "$pattern"
|
|
|
if [ $? -ne 0 ] ; then
|
|
|
- printf "FAIL: expected backtrace entry %d \"%s\" got \"%s\"\n" $idx "${expected[$idx]}" "$line"
|
|
|
+ printf "FAIL: expected backtrace entry \"%s\" got \"%s\"\n" "$pattern" "$line"
|
|
|
exit 1
|
|
|
fi
|
|
|
- let idx+=1
|
|
|
- [ -z "${expected[$idx]}" ] && break
|
|
|
done
|
|
|
|
|
|
# If any statements are executed from this point onwards,
|
|
@@ -58,6 +63,6 @@ skip_if_no_perf_probe && \
|
|
|
perf probe -q $libc inet_pton && \
|
|
|
trace_libc_inet_pton_backtrace
|
|
|
err=$?
|
|
|
-rm -f ${file}
|
|
|
+rm -f ${perf_data} ${perf_script} ${expected}
|
|
|
perf probe -q -d probe_libc:inet_pton
|
|
|
exit $err
|