Quick answer: Before launch, trigger a deliberate error in a release build on every platform you ship, and confirm it arrives with the right version, a readable stack trace and a screenshot. Then check grouping, alerts and crash-free sessions. Use a unique message per test, because SDKs drop repeats of the same error, and remember that test reports count toward your plan's report limit.
Most teams install a crash reporter, see one test error in the editor, and move on. Then launch day comes and the dashboard is quiet, not because the game is stable but because the release build was never wired up. An hour of testing before launch prevents that.
Three rules for testing
- Test release builds, not the editor. Editor runs use different settings, and some engine checks are compiled out of shipping builds.
- Test every platform you ship. Windows, Steam Deck, macOS, Android, iOS and the web each have their own failure modes.
- Use a unique message per test. SDKs drop repeats of the same error in a session, so a second identical test may never be sent.
Forcing a test error in each engine
Bind these to a debug key or a hidden menu option that you remove or disable before release.
Unity
throw new System.Exception("Crash reporting test 1"); // filed as [Crash]
Debug.LogError("Crash reporting test 2"); // filed as [Error]
Bugnet's Unity SDK captures exceptions, errors and failed asserts from Unity's log, so both appear as reports with the stack trace and the last 100 log lines.
Godot 4
push_error("Crash reporting test 3") # filed as [Error]
The Godot SDK reads engine errors, script errors and fatal errors from the engine's log file, which Godot writes on desktop platforms by default. On Android and iOS, enable debug/file_logging/enable_file_logging in Project Settings or nothing will be captured, and leave debug/file_logging/log_path at its default.
Unreal Engine
ensureMsgf(false, TEXT("Crash reporting test 4")); // Development builds
UE_LOG(LogTemp, Fatal, TEXT("Crash reporting test 5")); // a real fatal error
The Bugnet subsystem hooks Unreal's fatal-error and ensure handlers. ensure and check are compiled out of Shipping builds by default, so test ensures in a Development build and a fatal error in Shipping. Ensure reports are titled “Ensure condition failed” rather than carrying your message. A fatal report is sent from a process that is shutting down, which is exactly why it is worth confirming on each platform.
Web (HTML5)
setTimeout(() => { throw new Error('Crash reporting test 6'); });
Promise.reject(new Error('Crash reporting test 7'));
The web SDK listens for uncaught errors and unhandled promise rejections, and files up to 20 automatic reports per page load. Errors thrown by scripts served from another origin arrive as a bare “Script error.” unless the script is loaded with CORS, so serve your game's scripts from the same origin, or add the crossorigin attribute and send CORS headers from the script's host.
Pygame
raise RuntimeError("Crash reporting test 8")
The Pygame SDK installs a sys.excepthook, so an uncaught exception in the main thread is filed as a critical crash with a screenshot of the display. Exceptions in background threads do not reach sys.excepthook; catch them and call bugnet_sdk.report_error() yourself.
What to check on each test report
- It arrived within a minute, from the release build, on every platform.
- The version is right. It should match the build you are about to ship, not 0.1 or the editor default.
- The stack trace is readable, with your function names rather than addresses. If not, fix symbols or stripping settings now.
- The screenshot is there if you want one, and shows nothing private.
- Grouping works. Trigger the same test in a second session: it should stack onto the first report with an occurrence count of 2.
- Alerts fire. The Discord, Slack, Teams or email notification you rely on actually arrives.
- Crash-free sessions move. The crashed session shows up in the crash analytics for the build.
- The player report button works from the pause menu with a controller, not only a mouse.
Settings that silently stop reports
If nothing arrives, check the obvious first: the API key belongs to the right project, and the server URL is set. Then check the project's settings in Bugnet: Auto-file Errors must be on for automatic capture, and Editor Error Reporting decides whether errors from editor play sessions are filed. Finally, remove or disable your debug crash key before release, and delete the test reports from the dashboard. Deleting them does not give back report quota, so keep tests few on the free plan.
Create a free Bugnet project and run these tests in an afternoon. If you are still choosing a tool, see the best crash reporting tools for game developers.
Frequently asked questions
How do I test that crash reporting works in my game?
Trigger a deliberate error from a debug key in a release build on each platform you ship, then confirm the report arrives with the right version, a readable stack trace and a screenshot, and that grouping and alerts work.
Why did my second test crash not show up?
SDKs drop repeats of the same error within a session. Use a unique message for each test, or restart the game between tests.
Why are no errors captured in my Godot mobile build?
Bugnet's Godot SDK reads the engine log file, which Godot only writes on desktop by default. Enable debug/file_logging/enable_file_logging in Project Settings for Android and iOS.
Why does my web game report only Script error.?
Browsers hide details of errors thrown by scripts from another origin unless the script is loaded with CORS. Serve scripts from the same origin or use the crossorigin attribute.
Do test crash reports count toward my Bugnet plan?
Yes. Every report counts toward the account's report limit, and deleting reports does not free quota, so keep tests to a handful on the free plan.
Your crash reporter is only working if you have seen it work from the build players will run.