Crash self-report + round-completed latch + PDB archiving
CRASH SELF-REPORT (the #35/#41 heisenbug hunt): every unhandled exception now logs its code, address, and an EBP-walked stack as module-relative offsets (btl4+0xNNNN) into BT_LOG before dying -- any field crash on any machine hands us a resolvable stack. The walker is per-dereference guarded (a corrupt chain truncates). BT_CRASHTEST=1 exercises the path end-to-end (verified: forced AV logs code/addr/5-frame stack). mkdist archives each build's PDB next to its zip so offsets resolve per distributed version. Context: a flaky release-only crash in the mech build path surfaced during #38 rigs -- it moves with build layout, spares neither peer, and masks under a debugger heap (13 clean cdb runs vs 2/3 crashes without). A real latent memory bug; the self-report will catch it wherever it strikes next. ROUND-COMPLETED LATCH (issue #38, awaiting verification): relay-mode clients refuse RunMission after a round has ended -- the lobby-loop relaunch owns the next round (in-process round 2 rebuilt every player/mech entity on stale globals; matchlog caught player=3:1->3:36 in one generation). Latch sets ONLY when the stop ends a RUNNING mission (a stray pre-mission StopMission must not poison round 1 -- the first cut ate a legit launch, caught + fixed in rig). Regression verification pending (contaminated by the heisenbug above). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
ac7f0cb13a
commit
f7daf03507
@@ -142,5 +142,15 @@ def main():
|
||||
% (len(bats) + len(exes) + len(tracked), total / 1048576.0,
|
||||
zsz / 1048576.0))
|
||||
|
||||
# Crash-forensics: archive this build's PDB next to the zip (operator-side
|
||||
# only, never shipped) so the [crash] btl4+0xNNNN offsets in player logs
|
||||
# stay resolvable per distributed version.
|
||||
pdb = "build/Release/btl4.pdb"
|
||||
if os.path.exists(pdb):
|
||||
import shutil
|
||||
pdb_dest = zpath[:-4] + ".pdb"
|
||||
shutil.copyfile(pdb, pdb_dest)
|
||||
print(" symbols archived: %s" % pdb_dest)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user