1#!/bin/sh 2 3checkonly=no 4 5if [ "X$1" = "X--check" ] ; then 6 checkonly=yes 7 8 pid=$2 9 name=$3 10else 11 name=$1 12 pid=$2 13fi 14 15 16ec=0 17 18rm -f leaks-log > /dev/null 19 20# leaks dies on asan (rdar://14724199) 21if [ "$(uname -s)" = "Darwin" -a X"$asan" = X ]; then 22 echo "leaks check on $name ($pid)" 23 leaks -exclude __CFInitialize $pid > leaks-log 2>&1 || \ 24 { echo "leaks failed: $?"; cat leaks-log; exit 1; } 25 26 perl -e 'my $excluded = 0; my $num = -1; while (<>) { 27if (/Process \d+: (\d+) leaks? for \d+ total leaked bytes?/) { $num = $1;} 28if (/Process \d+: (\d+) leaks? malloced for \d+ total leaked byte?/) { $num = $1;} 29if (/(\d+) leaks? excluded/) { $excluded = $1;} 30} 31exit 1 if ($num != 0 && $num != $excluded); 32exit 0;' leaks-log || \ 33 { echo "Memory leak in $name" ; echo ""; cat leaks-log; ec=1; } 34 35 if grep -e '1 leak for' leaks-log > /dev/null && grep -e "Leak.*environ.*__CF_USER_TEXT_ENCODING" leaks-log > /dev/null ; then 36 echo "just running into rdar://problem/8764394" 37 ec=0 38 fi 39 40 [ "$ec" != "0" ] && { echo ""; cat leaks-log ; } 41 42 #[ "$ec" != "0" ] && { malloc_history $pid -all_by_size > l; } 43 #[ "$ec" != "0" ] && { env PS1=": leaks-debugger !!!! ; " bash ; } 44 45 [ "$ec" = "0" ] && rm leaks-log 46 47fi 48 49if [ "$checkonly" = no ] ; then 50 kill $pid 51 sleep 3 52 kill -9 $pid 2> /dev/null 53 sleep 3 54fi 55 56exit $ec 57