V45.43: fix Ozone 11 GUI crash on Intel UHD 630 + load diagnostics

Root-cause hypothesis: fx_vst_bridge parked embed window offscreen (-20000,-20000)
during VST3 editor attach; Ozone 11 GL init null-derefs (c0000005 in
iZOzone11Core.dll+18f6b92) on Intel ICD. Reaper hosts window on-screen -> OK.

- RenderFxJob.cpp: env toggle SF_FXGUI_ATTACH_ONSCREEN=1 -> SetWindowPos(100,100)
  before fxGuiLoadAttach, park back offscreen after attach succeeds
- main_fx.cpp: FxCrashDumpHandler prints [CRASH] in <module>+0x<offset> and
  [CRASH] minidump: <path> so logs name the faulting plugin DLL directly
- app.jsx VstGuiEmbed: frameLoadedRef + 90s watchdog -> onDead if bridge alive
  but no frame (no more infinite 'Dang tai plugin VST...' flash); clearer onDead
  toasts with %TEMP%\sf_dumps\fx_bridge_crash_*.dmp hint (track + master)
- rebuild fx_vst_bridge + daw_vst_bridge, NSIS/MSI v=202609021809
This commit is contained in:
2026-09-02 21:08:49 +07:00
parent 9f3b072be0
commit 244dc8ee9e
9 changed files with 53 additions and 13 deletions
+15 -1
View File
@@ -1906,9 +1906,23 @@ int run_fx_gui_server(const std::string& jobPath) {
fxGuiShmSetName(shm); // EARLY — frontend may /shm push before load finishes
int loadRc = 0;
const bool attachOnscreen = std::getenv("SF_FXGUI_ATTACH_ONSCREEN") != nullptr;
const int srv = fxGuiServerLoop(hwnd, [&]() {
// Some plugin GL editors (e.g. iZotope Ozone 11 on Intel UHD 630) crash
// when their editor window is parked offscreen during attach. Env toggle
// SF_FXGUI_ATTACH_ONSCREEN=1: show the window on-screen first, then park
// it back once the editor attached. Visible for one frame max (feeder is
// started only after attach succeeds).
if (attachOnscreen)
SetWindowPos(hwnd, nullptr, 100, 100, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
loadRc = fxGuiLoadAttach(&fx, path, name, hwnd, presetB64);
if (loadRc == 0) fxGuiStartFeederThread(&fx, hwnd); // after load+attach only
if (loadRc == 0) {
fxGuiStartFeederThread(&fx, hwnd); // after load+attach only
if (attachOnscreen)
SetWindowPos(hwnd, nullptr, -20000, -20000, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
}
if (loadRc != 0) PostMessageA(hwnd, WM_CLOSE, 0, 0); // exit; port already printed
});
RemovePropA(hwnd, "FXGUI_FX");
+13
View File
@@ -35,6 +35,18 @@ static LONG WINAPI FxCrashDumpHandler(EXCEPTION_POINTERS* ep) {
std::cerr << "[CRASH] fx_vst_bridge exception code=0x" << std::hex
<< (er ? er->ExceptionCode : 0) << " addr=0x"
<< (er ? (void*)er->ExceptionAddress : nullptr) << std::dec << std::endl;
if (er) {
HMODULE hMod = nullptr;
DWORD_PTR crashAddr = (DWORD_PTR)er->ExceptionAddress;
if (GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCSTR)er->ExceptionAddress, &hMod) && hMod) {
char modPath[MAX_PATH];
if (GetModuleFileNameA(hMod, modPath, MAX_PATH))
std::cerr << "[CRASH] in " << modPath << "+0x" << std::hex
<< (crashAddr - (DWORD_PTR)hMod) << std::dec << std::endl;
}
}
char dumpDir[MAX_PATH];
if (GetTempPathA(MAX_PATH, dumpDir)) {
std::strncat(dumpDir, "sf_dumps", MAX_PATH - std::strlen(dumpDir) - 1);
@@ -63,6 +75,7 @@ static LONG WINAPI FxCrashDumpHandler(EXCEPTION_POINTERS* ep) {
hFile, MiniDumpNormal, &mei, nullptr,
nullptr);
CloseHandle(hFile);
std::cerr << "[CRASH] minidump: " << dumpPath << std::endl;
}
}
}