Development Build Settings — What to Turn On and Off for a QA Build
How to configure Unity's Development Build and related options for QA, and what diagnostic evidence to check in a release-candidate build.
- unity
- build
- profiler
Notes from the trenches of Unity development and QA.
How to configure Unity's Development Build and related options for QA, and what diagnostic evidence to check in a release-candidate build.
The moment you hand a build to QA decides the quality of the reports that come back. Build identifiers, changelogs, known issues, and log retrieval paths — what needs to ship with the file, not just the file itself.
A stack trace only says where the game died. The logMessageReceived hook, the limits of the quitting event, watchdog processes, and periodic snapshots — four ways to keep the state leading up to a crash, and what each one costs.
What UnityCrashHandler64.exe is, where Windows crash artifacts live, and what to verify before changing a build that includes it.
A crash leaves different artifacts than a normal session — different files, different locations, generated only when the process dies. Windows crash folders, macOS system reports, Android logcat, and iOS crash logs, organized as a request you can hand a tester.
Sentry-style error monitoring and QA bug capture have different primary jobs. This post separates exception telemetry from reporting game bugs that leave no exception.
How to distinguish gameplay defects, agent decision errors, and test harness failures by recording and reviewing the full Jev gameplay run.
Separate severity, reproducibility, and evidence quality when triaging Jev automated-play reports, while keeping scoring policy and human review explicit.
How to connect game-specific anomaly checks to Rekon's code trigger so Jev-driven gameplay leaves behind the preceding video, logs, and state as evidence.
How far a Unity Recorder plus OBS replay buffer combo actually gets you, and the math for deciding when automated capture starts paying off.
Unity Cloud Diagnostics is being folded into Unity 6.2+ built-in Diagnostics. Here is what carries over and what you need to fill in yourself.
A category-by-category comparison of tools for capturing and reporting Unity bugs. The forks are whether it runs in builds, captures after the fact, has video, and syncs with game state.
Four buckets for game state — environment, session, moment, and repro clues — ranked by cost versus value, what to leave out, and the traps you hit when serializing it.
Comparing four delivery paths for Unity bug reports — capacity, auth complexity, searchability, and maintenance cost.
What Unity's official User Reporting package actually puts in a report, what it leaves out, and the ongoing shift from Cloud Diagnostics to the built-in Diagnostics service in Unity 6.2+ — sticking to confirmed facts only.
Trigger, capture, send, and identify — four independent decisions, the difficulty cliff between them, and the traps that show up when you build your own bug reporter.
Editor.log and Player.log paths per OS, the -logFile option, Android logcat and iOS log extraction. Everything about getting logs from QA, on one page.
Why log collection that worked perfectly in the editor behaves differently in a build. Stack trace settings, IL2CPP symbols and stripping, dev-build-only APIs, and the cost of Debug.Log itself.
A log collector that causes GC spikes defeats itself. Struct entries, fixed arrays, and telling controllable allocations apart from ones you never owned.
The exact difference between logMessageReceived and Threaded, UnityExceptions thrown inside the callback, recursive logging, and leaked subscriptions — the traps you actually hit when hooking logs.
Comparing gameplay recording options for QA and bug reporting. Editor-only or not, always-on or not, synced with game data or not — those are the forks in the road.
How to keep evidence of performance problems on QA machines with no Profiler attached. Lightweight always-on sampling with ProfilerRecorder, and putting the spike on the same timeline as the video.
The resolution test, what to actually look at in the Profiler, and splitting CPU/GPU time with FrameTimingManager. Turning felt reports into measured data.
CPU-bound, GPU-bound, GC spikes, loading hitches. Frame drops need classification before measurement, because the four have opposite fixes.
A bug report template that raises reproduction rates. Covers why each field is there, and which kinds of tickets end up closed as cannot-reproduce.
Hooking logs into a ring buffer, snapshotting game state, and writing it to disk — the minimum code to attach to a Unity project, plus the threading pitfall.
Comparing deterministic replay, state snapshots, and rolling buffers — and how the rolling buffer, the easiest to bolt onto a game client, actually works.
The three reasons reproduction fails, what a bug ticket actually has to carry, and why writing it down by hand is structurally too late.