macOS support is experimental Apple Silicon/arm64 support. If openQ4 crashes on macOS, a complete report is much more useful than a screenshot because the maintainer may not have access to a Mac.
This page is especially useful for startup crashes like GitHub issue #73, where the last visible lines can be in the Apple OpenGL 2.1, ARB2, and interaction program startup path.
Current builds default to r_appleARB2Interactions 0: stock surfaces use the
GLSL 1.10 material-interaction shader with neutral Quake 4 lighting values,
while unsupported/generated surfaces use a guarded SimpleInteraction.vfp
fallback. This restores interaction lighting instead of accepting the flat,
ambient-only image produced by the earlier workaround. Modes 1 and 2 force
the simple/full ARB paths for diagnosis; mode 3 is the emergency no-interaction
bypass and requires vid_restart.
If a current log contains ARB2 interaction driver bypass, the emergency mode
is active; older packages used that degraded bypass by default. It skips light
interaction drawing to avoid the known startup crash, so attach the terminal
output and support archive even if the game continues with visibly flat
lighting. Bypass builds also print breadcrumbs such as ARB2 interaction bypass state restored, ARB2 interaction bypass light scale skipped,
ARB2 interaction bypass ambient rescue, and ARB2 interaction bypass frame tail to identify the next classic renderer operation reached. Older 0.6.92
test builds could stop at ARB2 interaction bypass light scale; newer builds
skip that post-interaction light-scale pass on the degraded Apple GL 2.1 path.
Attach or paste these items when possible:
- The exact openQ4 version and package artifact name, such as
openq4-0.6.8-macos-arm64-metal.dmg. - Whether you used the OpenGL package, the Metal bridge package, or both.
- Whether you launched
openQ4.app,openQ4-client_arm64from Terminal,openQ4-ded_arm64from Terminal, or more than one path. - macOS version/build and hardware model.
sw_versplus the Apple Silicon generation, such as M4 Max or M5, is enough. - Full terminal output as text, not only a screenshot.
~/Library/Application Support/openQ4/baseoq4/logs/openq4.logwhen it exists.- The matching
.ipsor.crashfile from~/Library/Logs/DiagnosticReportswhen macOS writes one. SYMBOLS.txtfrom the package root or frompackage/SYMBOLS.txtinside the support archive, if present.package/build-metadata.txtfrom the support archive, or the packageVERSION.txtlines foropenq4_commitandopenq4_game_commitwhen present.- OpenAL audio lines from
openq4.logwhen present:OpenAL vendor:,OpenAL renderer:,OpenAL active device:, and anyOpenAL EFX ...warning/status lines. system/rosetta.txt,logs/renderer-summary.txt,logs/renderer-config.txt,package/binary-architecture.txt,package/dylib-dependencies.txt,package/signing.txt, andpackage/quarantine.txtfrom the support archive when present.- Whether
openQ4.appwas launched from the DMG or after being dragged to/Applications, and whether loose client/dedicated tools were launched from a whole copied package.
Do not attach retail Quake 4 q4base/*.pk4 assets.
From Terminal, run the app executable from any working directory and redirect output to a text file:
cd /tmp
"/Applications/openQ4.app/Contents/MacOS/openQ4" > ~/Desktop/openq4-terminal.txt 2>&1For dedicated-server reports, run the dedicated binary from the same package root and redirect output separately:
cd "/path/to/openQ4 package"
./openQ4-ded_arm64 +set dedicated 1 > ~/Desktop/openq4-ded-terminal.txt 2>&1If the app, client, or dedicated server crashes, attach the matching terminal text file or paste its full contents into the issue.
For issue #73 style reports, keep the lines around these markers:
----- R_InitOpenGL -----R_ReloadARBProgramsinteraction color moderenderer startup phaselast renderer startup phasefirst ARB2 interaction handoffautomatic stock GLSL interactions with simple ARB per-surface fallbackmaterial_interactionARB2 interaction driver bypassARB2 interaction bypass state restoredARB2 interaction bypass light scaleARB2 interaction bypass light scale skippedARB2 interaction bypass ambient rescueARB2 interaction bypass frame tailARB2 light interactionRenderer upload managerusing ARB2 renderSystemUnsupported Apple OpenGL 2.1 compatibility pathSimpleInteraction.vfpForward render target MSAA: requestedidRenderTexture::InitRenderTextureGL_FRAMEBUFFER_Filesystem paths:Selected game module:Game module search failed:Game module load failed:dlopen ... failed:fatal signal SIGSEGV
macOS packages include collect_macos_support_info.sh in the package root. Run
it from Terminal:
cd "/path/to/openQ4 package"
./collect_macos_support_info.shIf macOS refuses to execute the script directly, run it through sh:
sh ./collect_macos_support_info.shThe script creates an archive named like:
openq4-macos-support-YYYYMMDD-HHMMSSZ.tar.gz
Review the archive before attaching it publicly. The collector redacts
/Users/<name> paths and email-like strings, does not dump the environment,
does not launch openQ4, and does not copy retail q4base PK4 assets.
Copied text is sanitized for embedded control characters, and command/report
output is stream-limited before redaction so noisy system tools cannot inflate
the support archive.
It also does not follow symlinked package, log, or crash-report inputs; skipped
symlinks are recorded in the relevant report files instead of copying or
inspecting their targets.
If the Terminal or automation environment did not set HOME, the collector
still creates the archive and records notes that home-scoped logs and
DiagnosticReports were skipped.
If a DiagnosticReports filename contains unusual characters, the collector
records a skipped-file note instead of placing that name into the support
archive.
Generated support archives are private by default and the collector refuses to
overwrite an existing archive with the same timestamp. Very large copied text
files are bounded: package/log text is limited to the final 2 MiB, and crash
reports are limited to the final 8 MiB, with a truncation note written into the
copied file.
The archive includes package/path-resolution.txt. That file records the
package root, app path, expected loose runtime paths, and any copied log lines
that mention fs_basepath, fs_cdpath, and fs_savepath. It does this
without launching openQ4.
The archive also includes package/build-metadata.txt. That file copies the
package/app VERSION.txt metadata lines, including openq4_commit,
openq4_dirty, openq4_game_commit, and openq4_game_dirty when the package
contains them, plus the baseoq4/ game module filenames.
The archive also includes logs/openal-summary.txt when the collector can read
an existing log. It copies the OpenAL vendor, renderer, version, requested/default
or active device name, and OpenAL EFX warning/status lines without launching
openQ4.
The archive also includes logs/renderer-summary.txt when an existing log is
available. It copies renderer startup, driver-quirk, interaction fallback,
render-target/MSAA, selected filesystem/module, and fatal-signal diagnostics.
That includes lines such as R_InitOpenGL, Renderer driver quirks,
material_interaction, GL_FRAMEBUFFER_*, Forward render target MSAA,
Filesystem paths:, Selected game module:, ARB2 interaction driver bypass,
Game module search failed:, Game module load failed:, dlopen ... failed:,
and fatal signal SIGSEGV.
If a launch stops with couldn't find game dynamic library, include the
Game module search failed: line. It lists only the trusted package locations
that were checked, so maintainers can distinguish a damaged app from an older
package layout. A current self-contained app should search its
openQ4.app/Contents/Frameworks directory for game-sp_arm64.dylib and
game-mp_arm64.dylib; do not manually copy game modules into retail q4base.
If the module was found but the launch stops with couldn't load game dynamic library, include both Game module load failed: and the preceding
dlopen ... failed: line. Together they identify the selected module and the
platform loader's reason, such as a code-signing or dependent-library problem.
The archive also includes logs/renderer-config.txt when a saved
openQ4Config.cfg is available. It copies only renderer/performance cvar lines:
r_*, com_machineSpec, and com_performancePreset. It does not copy
bindings, player/account, network, audio-device, or arbitrary config settings.
This lets maintainers compare graphics changes from issue #73-style reports
without requesting a user's full personal config.
The archive also includes system/rosetta.txt. That file records arch,
uname -m, and sysctl.proc_translated output from the collector process so
maintainers can spot unsupported Rosetta or translated-Terminal reports.
The archive also includes package/binary-architecture.txt. That file records
read-only file and lipo -archs output for the app executable, loose
client/dedicated binaries, and game modules so maintainers can spot wrong-arch
or universal-binary surprises.
The archive also includes package/dylib-dependencies.txt. That file records
read-only otool -L dependency output and otool -D game-module install names
so maintainers can spot unexpected non-system dependencies or broken
@loader_path module names.
The archive also includes package/signing.txt. That file records read-only
codesign, spctl --assess --type execute --verbose=4, and
xcrun stapler validate checks for the app bundle, loose binaries, and game
modules without launching openQ4.
The archive also includes package/quarantine.txt. That file lists
extended-attribute names and reports whether com.apple.quarantine is present;
it does not copy extended-attribute values.
Current release packages remain Apple Silicon/arm64 only, but the architecture,
signing, Gatekeeper, and quarantine reports also inspect any loose x64 or
x86 openQ4 executable names if they are present. That makes wrong-arch or
future cross-arch package contents visible without treating those paths as
supported release targets.
macOS packages include a small SYMBOLS.txt manifest at the package root. It
names the matching openq4-<version>-macos-arm64-<bridge>-symbols.tar.xz
dSYM archive and lists the packaged binary checksums and Mach-O UUIDs.
If you attach a .ips or .crash report, also attach SYMBOLS.txt or run the
support collector so it can copy the file to package/SYMBOLS.txt. Maintainers
use that manifest to choose the correct symbol archive; the support archive does
not include .dSYM debug bundles.
Maintainer details live in macOS Symbolication Workflow.
If the helper is not available, collect these manually:
~/Library/Application Support/openQ4/baseoq4/logs/openq4.log
~/Library/Logs/DiagnosticReports/openQ4*.ips
~/Library/Logs/DiagnosticReports/openQ4*.crash
~/Library/Logs/DiagnosticReports/openQ4-client*.ips
~/Library/Logs/DiagnosticReports/openQ4-client*.crash
~/Library/Logs/DiagnosticReports/openQ4-ded*.ips
~/Library/Logs/DiagnosticReports/openQ4-ded*.crash
Also include the output of:
sw_vers
uname -a
system_profiler SPHardwareDataType
system_profiler SPDisplaysDataTypeThe current macOS client is self-contained. It uses this internal layout:
openQ4.app/Contents/MacOS/openQ4
openQ4.app/Contents/Resources/baseoq4/
openQ4.app/Contents/Frameworks/game-sp_arm64.dylib
openQ4.app/Contents/Frameworks/game-mp_arm64.dylib
Finder may start the app with an unrelated process working directory; current
builds use embedded Contents/Resources as fs_cdpath, while a separately
discovered Steam/GOG install remains fs_basepath for retail q4base. Dragging
only openQ4.app to /Applications is supported. Keep the whole extracted
package only when testing the loose diagnostic client, dedicated server, or
support collector, which discover the sibling app runtime. Do not modify the
signed app by adding retail assets.