Files
takana/scripts/diagnostico/verificar-arreglo-sandbox.sh
T
Sergio 17f8f4fb80 takana: la ruta del repo es /mnt/vvv/takana
El directorio se movio de verdad, asi que las referencias absolutas dentro del
repo ya eran incorrectas. Tambien los ejemplos que usaban ~/hammer.

NO se tocan docs/evidencia/: son REGISTRO de lo que se corrio ese dia, y
reescribir una ruta ahi adentro falsifica la evidencia. Que nombren una ruta que
ya no existe es correcto: existia cuando se midio.
2026-09-09 20:08:02 +00:00

59 lines
3.5 KiB
Bash
Executable File

#!/bin/bash
# verificar-arreglo-sandbox.sh — A/B del arreglo del cuelgue: arnés VIEJO contra arnés ARREGLADO,
# intercalados, bajo la presión de memoria en la que aparecieron los cuelgues.
#
# VIEJO = MOZ_DISABLE_CONTENT_SANDBOX=1 solamente ⇒ 2 segfaults de 'Sandbox Forked' por corrida
# ARREGLADO = las 5 MOZ_DISABLE_*_SANDBOX ⇒ 0 segfaults, 0 EPERM, 0 helpers
#
# El marcador que se mide NO es el cuelgue (2,5 %: haría falta muchísima corrida) sino el SEGFAULT,
# que está en el 100 % de las corridas del arnés viejo. Un mecanismo presente siempre se puede
# refutar con pocas muestras; un síntoma raro, no. El recuento de cuelgues va igual, como control.
set -u
RAIZ=/mnt/vvv/takana; R=$RAIZ/store/.rootfs/sway-v2
AQUI=$(cd "$(dirname "$0")" && pwd); N=${N:-50}; UMBRAL=${UMBRAL:-60}
A=$(ls -d $RAIZ/store/3d199174*-firefox | head -1)
VIEJO='MOZ_DISABLE_CONTENT_SANDBOX=1'
NUEVO='MOZ_DISABLE_CONTENT_SANDBOX=1 MOZ_DISABLE_GMP_SANDBOX=1 MOZ_DISABLE_RDD_SANDBOX=1 MOZ_DISABLE_SOCKET_PROCESS_SANDBOX=1 MOZ_DISABLE_UTILITY_SANDBOX=1'
declare -A SEGV COLG SHOT
for k in viejo nuevo; do SEGV[$k]=0; COLG[$k]=0; SHOT[$k]=0; done
python3 "$AQUI/presion-memoria.py" 2000 3600 >/dev/null 2>&1 & HOG=$!
trap 'kill $HOG 2>/dev/null' EXIT
for _ in $(seq 1 40); do sleep 2; [ "$(awk '/MemAvailable/{print int($2/1024)}' /proc/meminfo)" -le 2300 ] && break; done
echo "presión lista: disponible=$(awk '/MemAvailable/{print int($2/1024)}' /proc/meminfo) MiB"
for i in $(seq 1 $N); do
for k in viejo nuevo; do
[ $k = viejo ] && ENV="$VIEJO" || ENV="$NUEVO"
SAL=$(mktemp -d)
# ⚠ `setsid` + matar el GRUPO, no el bwrap (medido 2026-09-08, DOS veces el mismo día).
# `kill $BW` mata el bwrap EXTERIOR, que no es el init del namespace de PID: el firefox de
# dentro sobrevive. Y si el arnés corría bajo `flock`, ese superviviente HEREDA el fd del lock
# y deja a la granja sin poder compilar hasta que alguien lo note — pasó hora y media, en
# silencio. Medido: matando sólo el bwrap queda 1 firefox vivo; matando el grupo, 0.
setsid bwrap --ro-bind "$R" / --ro-bind /usr/lib/musl/lib/libc.so /lib/ld-musl-x86_64.so.1 \
--ro-bind "$A/usr/lib/firefox" /usr/lib/firefox --dev /dev --proc /proc --tmpfs /run --tmpfs /tmp \
--unshare-pid --ro-bind "$AQUI" /bench --bind "$SAL" /salida --unshare-user --uid 0 --gid 0 \
--setenv PATH /usr/bin:/bin --setenv APAGA "$ENV" \
/bin/sh -c 'export HOME=/tmp/h MOZ_HEADLESS=1 LIBGL_ALWAYS_SOFTWARE=1 LANG=C.UTF-8; mkdir -p $HOME; export $APAGA
LD_LIBRARY_PATH=/usr/lib/firefox /usr/lib/firefox/firefox --headless --screenshot /salida/x.png file:///bench/fuera-del-corpus.html' \
>"$SAL/nav.log" 2>&1 &
BW=$!; t=0
while kill -0 $BW 2>/dev/null && [ $t -lt $UMBRAL ]; do sleep 1; t=$((t+1)); done
if kill -0 $BW 2>/dev/null; then
COLG[$k]=$(( ${COLG[$k]} + 1 )); cp -r "$SAL" "$RAIZ/work/colgada-$k-$i" 2>/dev/null
kill -TERM -$BW 2>/dev/null; sleep 3; kill -KILL -$BW 2>/dev/null # el GRUPO
else
wait $BW 2>/dev/null
SEGV[$k]=$(( ${SEGV[$k]} + $(grep -c 'exited on signal 11' "$SAL/nav.log") ))
[ -f "$SAL/x.png" ] && SHOT[$k]=$(( ${SHOT[$k]} + 1 ))
fi
rm -rf "$SAL"
done
[ $((i % 10)) = 0 ] && echo " $i/$N · viejo segv=${SEGV[viejo]} colg=${COLG[viejo]} · nuevo segv=${SEGV[nuevo]} colg=${COLG[nuevo]}"
done
echo ""
for k in viejo nuevo; do
printf "%-10s segfaults=%-4s COLGADAS=%-3s screenshots=%s/%s\n" "$k" "${SEGV[$k]}" "${COLG[$k]}" "${SHOT[$k]}" "$N"
done