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

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

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.