docs/re: three more runs, and eh_dispatch is still untested — with the proof why
Drove NEW GAME deliberately (the menu's first item, no d-pad, which is what the run that first hit the crash actually did). Three runs with --eh_dispatch on: no crash, no throw, black screen before the save-slot screen. It is tempting to read that as the flag working. The run with --cache_throw_diag as well disproves it. That cvar logs the throw BEFORE any dispatch is attempted, so a throw would appear whatever dispatch then did — and there were zero. No guest exception happened, so neither flag ran any code, so neither can explain the difference. What took those runs out is the intermittent content-load hang, before the crash path was reached. eh_dispatch therefore stays untested, and the entry says so with the reasoning rather than banking a false pass. Confirmed on the way: the screen after NEW GAME is DIFFICULTY — its whole-image signature matches the earlier capture exactly — so the menu path is understood even though the runs die after it.
This commit is contained in:
@@ -352,3 +352,32 @@ Neither has been beaten, and this run tested neither: it took a different branch
|
||||
through the menus than the run before it (TUTORIAL leads to a lesson list, and
|
||||
the DIFFICULTY screen captured earlier came from a different selection). The
|
||||
`--eh_dispatch` test needs a run that actually reaches `SELECT DATA`.
|
||||
|
||||
### `--eh_dispatch` is still untested, and here is why that is a logical claim, not an excuse
|
||||
|
||||
Three more runs, driving **NEW GAME** deliberately (the menu's first item, no
|
||||
d-pad — which is what the run that first hit the crash actually did, though it
|
||||
believed it had chosen TUTORIAL):
|
||||
|
||||
| flags | reached | crash dumps | `GUEST-THROW` |
|
||||
|---|---|---|---|
|
||||
| *(none)* — earlier run | menu → DIFFICULTY → **SELECT DATA** | **537** | yes |
|
||||
| `--eh_dispatch=true` ×2 | menu → black | 0 | 0 |
|
||||
| `--eh_dispatch=true --cache_throw_diag=true` | menu → **DIFFICULTY** → black | 0 | **0** |
|
||||
|
||||
The third row is the informative one. `cache_throw_diag` runs `LogGuestThrow`
|
||||
**before** any dispatch is attempted, so a throw would have been logged whatever
|
||||
the dispatch then did — and there were **none**. So no guest exception occurred
|
||||
in that run at all, and neither flag can have changed anything: both are inert
|
||||
until a throw happens.
|
||||
|
||||
**Therefore the difference between the rows is not the flags.** It is the
|
||||
intermittent content-load hang, which took the run out before it reached the
|
||||
save-slot screen. The flag remains untested for the reason the runs record, and
|
||||
the temptation to read "0 crashes with `--eh_dispatch`" as a fix is exactly what
|
||||
the log disproves.
|
||||
|
||||
Also confirmed on the way: the screen after NEW GAME is **DIFFICULTY** — its
|
||||
whole-image signature `(9.7, 19.5, 53.9)` matches the earlier capture of that
|
||||
screen exactly — so the menu path is understood even though the run dies after
|
||||
it.
|
||||
|
||||
53
tools/re-capture/newgame_path.sh
Executable file
53
tools/re-capture/newgame_path.sh
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bash
|
||||
# Boot -> title -> main menu -> NEW GAME -> DIFFICULTY -> SELECT DATA, and report
|
||||
# the crash count there.
|
||||
#
|
||||
# NEW GAME is the menu's FIRST item, so this presses (A) with no d-pad movement —
|
||||
# which is also what the run that first hit the SELECT DATA crash did, though it
|
||||
# thought it was choosing TUTORIAL (the d-pad steps had not registered). TUTORIAL
|
||||
# leads somewhere else entirely, to a lesson list, so it cannot test this crash.
|
||||
#
|
||||
# EXTRA_FLAGS is passed to the emulator, e.g. --eh_dispatch=true.
|
||||
set -u
|
||||
export HOME=/sylph-home/re SDL_AUDIODRIVER=dummy DISPLAY=:98
|
||||
SD="$(cd "$(dirname "$0")" && pwd)"
|
||||
OUT="${1:-/sylph-home/re/newgame}"
|
||||
mkdir -p "$OUT"
|
||||
shot(){ screenshot "$1" >/dev/null 2>&1; }
|
||||
screen(){ shot /tmp/ng.png; python3 "$SD/screen_id.py" /tmp/ng.png | awk '{print $1}'; }
|
||||
crashes(){ grep -c "CRASH DUMP" "$OUT/canary.stdout" 2>/dev/null || echo 0; }
|
||||
alive(){ ps -o pid=,stat= -C xenia_canary 2>/dev/null | awk '$2 !~ /^Z/ {print $1}'; }
|
||||
|
||||
for attempt in $(seq 1 "${ATTEMPTS:-3}"); do
|
||||
echo "=== attempt $attempt flags: ${EXTRA_FLAGS:-<none>}"
|
||||
pkill -9 -x xenia_canary 2>/dev/null; sleep 3
|
||||
( cd "$OUT" && nohup run-canary --mem_watch=false ${EXTRA_FLAGS:-} \
|
||||
--logged_profile_slot_0_xuid=B13EBABEBABEBABE >"$OUT/canary.stdout" 2>&1 & )
|
||||
sleep 8
|
||||
until xdotool search --name "Xenia-canary" >/dev/null 2>&1; do
|
||||
[ -n "$(alive)" ] || { echo "EMULATOR GONE"; exit 4; }; sleep 1
|
||||
done
|
||||
|
||||
s=""; deadline=$(( SECONDS + 420 ))
|
||||
while [ $SECONDS -lt $deadline ]; do
|
||||
s="$(screen)"; [ "$s" = "title" ] && break; sleep 2
|
||||
done
|
||||
[ "$s" = "title" ] || { echo "NO TITLE this attempt"; continue; }
|
||||
echo "title -> A"
|
||||
python3 "$SD/pad.py" tap A 0.3
|
||||
for _ in 1 2 3 4 5 6 7 8; do sleep 3; s="$(screen)"; [ "$s" = "menu" ] && break; done
|
||||
[ "$s" = "menu" ] || { echo "(A) not accepted; rebooting"; continue; }
|
||||
|
||||
echo "menu -> A (NEW GAME, no d-pad)"
|
||||
python3 "$SD/pad.py" tap A 0.3; sleep 10; shot "$OUT/step1.png"
|
||||
echo " after NEW GAME: $(screen) crashes=$(crashes)"
|
||||
echo "difficulty -> A (NORMAL)"
|
||||
python3 "$SD/pad.py" tap A 0.3
|
||||
for i in $(seq 1 12); do
|
||||
sleep 8; shot "$OUT/step2-$(printf '%02d' "$i").png"
|
||||
echo " t+$((i*8))s $(screen) crashes=$(crashes)"
|
||||
done
|
||||
echo "RESULT flags='${EXTRA_FLAGS:-<none>}' crash_dumps=$(crashes) throws=$(grep -c 'Guest attempted to throw' "$OUT/canary.stdout" 2>/dev/null || echo 0)"
|
||||
exit 0
|
||||
done
|
||||
echo "GAVE UP after ${ATTEMPTS:-3} boots"
|
||||
Reference in New Issue
Block a user