# probe_attach_detail.py - targeted runs to distinguish crash-in-attach vs # teardown for gui_probe. Prints FULL stdout + real returncode. import subprocess, sys, time, os sys.stdout.reconfigure(encoding="utf-8", errors="replace") PROBE = r"C:\Users\locpham\SonicForgeStudio\native_bridge\build\Release\gui_probe.exe" CASES = [ # (label, plugin, variant, secs) ("nexus_bridge_two", r"C:\Program Files\Common Files\VST3\Nexus.vst3", "bridge_two", 8), ("nexus_bridge_two_25s",r"C:\Program Files\Common Files\VST3\Nexus.vst3", "bridge_two", 25), ("nexus_same_thread", r"C:\Program Files\Common Files\VST3\Nexus.vst3", "same_thread", 8), ("nexus_main_own", r"C:\Program Files\Common Files\VST3\Nexus.vst3", "main_own", 8), ("scaler2_bridge_two", r"C:\Program Files\Common Files\VST3\Scaler2.vst3", "bridge_two", 8), ("ezkeys_bridge_two", r"C:\Program Files\Common Files\VST3\Toontrack\EZkeys 2.vst3", "bridge_two", 8), ("kontakt_bridge_two", r"C:\Program Files\Common Files\VST3\Kontakt.vst3", "bridge_two", 8), ("kontakt_main_own", r"C:\Program Files\Common Files\VST3\Kontakt.vst3", "main_own", 8), ("nexus_two_workers_close", r"C:\Program Files\Common Files\VST3\Nexus.vst3", "two_workers_close", 8), ] for label, plugin, variant, secs in CASES: t0 = time.time() print(f"\n===== {label} ({variant}, {secs}s) =====", flush=True) try: r = subprocess.run([PROBE, plugin, variant, str(secs)], capture_output=True, text=True, timeout=secs + 25, creationflags=subprocess.CREATE_NO_WINDOW) out = (r.stdout or "") + (r.stderr or "") print(f"returncode={r.returncode} ({r.returncode & 0xFFFFFFFF:08X}) secs={time.time()-t0:.1f}") print(out) except subprocess.TimeoutExpired: print(f"HARD-TIMEOUT after {time.time()-t0:.1f}s") print("-----", flush=True)