ERR/E3.0 (slice 3e rung 2): iOS-simulator stepping verified
Closes out E3's stepping-verification ladder to the extent possible headlessly. - Verified `sx build --target ios-sim --emit-obj` produces an arm64-ios-simulator Mach-O that runs under `simctl spawn` and steps in lldb (the backtrace shows a dyld_sim frame — the sim runtime). - Verified the device-applicable .dSYM path: dsymutil collects the DWARF, and after removing the .o lldb still resolves source via the .dSYM. - debug_stepping_smoke.sh gains an optional iOS-sim rung that reuses an already-booted simulator (never boots one — single-sim policy) and exercises the .dSYM path; skips cleanly when no sim is booted. - docs/debugger.md: rungs 1-2 marked verified; the iOS-device rung is documented as a manual checklist (needs hardware + get-task-allow signing) — no compiler gap, --emit-obj + standard Apple tools suffice. E3 is functionally complete and verified across macOS + iOS-simulator.
This commit is contained in:
@@ -39,16 +39,37 @@ out=$(cd "$ROOT_DIR" && lldb --batch \
|
||||
-o "breakpoint set --file dbg_smoke.sx --line 3" \
|
||||
-o "run" -o "bt" -o "quit" "$BIN" 2>&1)
|
||||
|
||||
rm -f "$SRC" "$BIN" "$TMP/main.o"
|
||||
|
||||
fail=0
|
||||
echo "$out" | grep -q "dbg_smoke.sx:3" || { echo "FAIL: breakpoint did not resolve to dbg_smoke.sx:3"; fail=1; }
|
||||
echo "$out" | grep -q "add at dbg_smoke.sx:3" || { echo "FAIL: stopped frame not source-mapped"; fail=1; }
|
||||
echo "$out" | grep -q "main at dbg_smoke.sx:6" || { echo "FAIL: caller frame not source-mapped"; fail=1; }
|
||||
echo "$out" | grep -q "dbg_smoke.sx:3" || { echo "FAIL[macos]: breakpoint did not resolve to dbg_smoke.sx:3"; fail=1; }
|
||||
echo "$out" | grep -q "add at dbg_smoke.sx:3" || { echo "FAIL[macos]: stopped frame not source-mapped"; fail=1; }
|
||||
echo "$out" | grep -q "main at dbg_smoke.sx:6" || { echo "FAIL[macos]: caller frame not source-mapped"; fail=1; }
|
||||
[[ $fail -eq 0 ]] && echo "ok[macos]: lldb stepped sx source (debug map -> kept .o)"
|
||||
|
||||
if [[ $fail -eq 0 ]]; then
|
||||
echo "ok: lldb stepped sx source (breakpoint + backtrace resolved via DWARF)"
|
||||
exit 0
|
||||
# Rung 2 (iOS simulator) — runs ONLY against an ALREADY-booted simulator; it
|
||||
# never boots one itself (use a single sim — boot one yourself if you want this
|
||||
# rung). Builds for ios-sim, collects a .dSYM (the device-applicable artifact),
|
||||
# and steps in the sim. Skipped if no booted sim / no ios-sim SDK.
|
||||
sim_booted=$(xcrun simctl list devices booted 2>/dev/null | grep -c Booted || true)
|
||||
if [[ "${sim_booted:-0}" -gt 0 ]] && xcrun --sdk iphonesimulator --show-sdk-path >/dev/null 2>&1; then
|
||||
"$SX" build --target ios-sim --emit-obj "$SRC" -o "$BIN" >/dev/null 2>&1 || { echo "FAIL[ios-sim]: build"; fail=1; }
|
||||
dsymutil "$BIN" -o "$BIN.dSYM" >/dev/null 2>&1 # the .app ships a .dSYM, not the .o
|
||||
rm -f "$TMP/main.o" # force resolution via the .dSYM
|
||||
sout=$(cd "$ROOT_DIR" && timeout 120 lldb --batch \
|
||||
-o "breakpoint set --file dbg_smoke.sx --line 3" \
|
||||
-o "run" -o "bt" -o "quit" "$BIN" 2>&1)
|
||||
if echo "$sout" | grep -q "add at dbg_smoke.sx:3" && echo "$sout" | grep -q "main at dbg_smoke.sx:6"; then
|
||||
echo "ok[ios-sim]: lldb stepped sx source in the simulator (via .dSYM)"
|
||||
else
|
||||
echo "FAIL[ios-sim]: lldb did not resolve in the simulator"; fail=1
|
||||
echo "--- ios-sim lldb output ---"; echo "$sout"
|
||||
fi
|
||||
rm -rf "$BIN" "$BIN.dSYM"
|
||||
else
|
||||
echo "skip[ios-sim]: no booted simulator (boot one to exercise this rung)"
|
||||
fi
|
||||
echo "--- lldb output ---"; echo "$out"
|
||||
|
||||
# Rung 3 (iOS device) is a documented manual checklist — see docs/debugger.md.
|
||||
|
||||
rm -f "$SRC" "$BIN" "$TMP/main.o"
|
||||
[[ $fail -eq 0 ]] && exit 0
|
||||
exit 1
|
||||
|
||||
Reference in New Issue
Block a user