bSendUnattendedBugReports
bSendUnattendedBugReports
#Overview
name: bSendUnattendedBugReports
The value of this variable can be defined or overridden in .ini config files. 1
.ini config file referencing this setting variable.
It is referenced in 29
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of bSendUnattendedBugReports is to control whether the Unreal Engine should automatically send bug reports to Epic Games without user intervention when crashes or errors occur in unattended scenarios.
This setting variable is primarily used by the crash reporting and analytics systems within Unreal Engine. It is referenced in various modules, including:
- The Zen module (Developer/Zen)
- The UnrealEd module (Editor/UnrealEd)
- The Core module (Runtime/Core)
- The CrashReportClient program
The value of this variable is typically set in the engine configuration files, specifically in the GEditorSettingsIni file under the “/Script/UnrealEd.CrashReportsPrivacySettings” section. It can be modified through the engine’s settings interface or directly in the configuration files.
This variable interacts with other privacy and crash reporting settings, such as bSendUsageData and bNoDialog. It is often used in conjunction with these variables to determine the appropriate behavior for crash reporting in different scenarios.
Developers should be aware that:
- This setting affects the privacy of users and the collection of crash data.
- It behaves differently in editor builds compared to non-editor builds.
- In some cases, it may be overridden or ignored based on other conditions (e.g., running as a dedicated server).
Best practices when using this variable include:
- Clearly communicating to users how this setting affects their privacy and data collection.
- Providing an easy way for users to modify this setting.
- Respecting the user’s choice and not overriding it without good reason.
- Considering the implications of this setting on different build types (editor, game, server, etc.).
- Regularly reviewing and updating privacy policies related to crash reporting and data collection.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/BaseEditorSettings.ini:14, section: [/Script/UnrealEd.CrashReportsPrivacySettings]
- INI Section:
/Script/UnrealEd.CrashReportsPrivacySettings
- Raw value:
True
- Is Array:
False
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Developer/Zen/Private/ZenServerInterface.cpp:947
Scope (from outer to inner):
file
namespace UE::Zen
function bool FServiceSettings::ReadFromConfig
Source code excerpt:
ApplyProcessLifetimeOverride(AutoLaunchSettings.bLimitProcessLifetime);
EnsureEditorSettingsConfigLoaded();
GConfig->GetBool(TEXT("/Script/UnrealEd.CrashReportsPrivacySettings"), TEXT("bSendUnattendedBugReports"), AutoLaunchSettings.bSendUnattendedBugReports, GEditorSettingsIni);
}
}
else
{
// ConnectExisting settings
const TCHAR* ConnectExistingConfigSection = TEXT("Zen.ConnectExisting");
#Loc: <Workspace>/Engine/Source/Developer/Zen/Private/ZenServerInterface.cpp:982
Scope (from outer to inner):
file
namespace UE::Zen
function bool FServiceSettings::ReadFromCompactBinary
Source code excerpt:
AutoLaunchSettings.bLimitProcessLifetime = AutoLaunchSettingsObject["LimitProcessLifetime"].AsBool();
ApplyProcessLifetimeOverride(AutoLaunchSettings.bLimitProcessLifetime);
AutoLaunchSettings.bSendUnattendedBugReports = AutoLaunchSettingsObject["SendUnattendedBugReports"].AsBool();
AutoLaunchSettings.bIsDefaultSharedRunContext = AutoLaunchSettingsObject["IsDefaultSharedRunContext"].AsBool(AutoLaunchSettings.bIsDefaultSharedRunContext);
}
}
}
else
{
#Loc: <Workspace>/Engine/Source/Developer/Zen/Private/ZenServerInterface.cpp:1042
Scope (from outer to inner):
file
namespace UE::Zen
function void FServiceSettings::WriteToCompactBinary
Source code excerpt:
Writer << "IsDefaultDataPath" << AutoLaunchSettings.bIsDefaultDataPath;
Writer << "LimitProcessLifetime" << AutoLaunchSettings.bLimitProcessLifetime;
Writer << "SendUnattendedBugReports" << AutoLaunchSettings.bSendUnattendedBugReports;
Writer << "IsDefaultSharedRunContext" << AutoLaunchSettings.bIsDefaultSharedRunContext;
Writer.EndObject();
}
else
{
const FServiceConnectSettings& ConnectExistingSettings = SettingsVariant.Get<FServiceConnectSettings>();
#Loc: <Workspace>/Engine/Source/Developer/Zen/Private/ZenServerInterface.cpp:1634
Scope (from outer to inner):
file
namespace UE::Zen
function static FString DetermineCmdLineWithoutTransientComponents
Source code excerpt:
}
if (!InSettings.bSendUnattendedBugReports)
{
Parms.Append(TEXT(" --no-sentry"));
}
return Parms;
}
#Loc: <Workspace>/Engine/Source/Developer/Zen/Public/Experimental/ZenServerInterface.h:44
Scope (from outer to inner):
file
namespace UE::Zen
Source code excerpt:
bool bIsDefaultDataPath = false;
bool bLimitProcessLifetime = false;
bool bSendUnattendedBugReports = false;
bool bIsDefaultSharedRunContext = true;
};
struct FServiceSettings
{
TVariant<FServiceAutoLaunchSettings, FServiceConnectSettings> SettingsVariant;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Classes/Analytics/CrashReportsPrivacySettings.h:22
Scope (from outer to inner):
file
class class UCrashReportsPrivacySettings : public UObject, public IImportantToggleSettingInterface
Source code excerpt:
/** Determines whether the editor automatically sends some bug reports Epic Games in order to improve Unreal Engine. Your information will never be shared with 3rd parties. */
UPROPERTY(EditAnywhere, config, Category=Options)
bool bSendUnattendedBugReports;
public:
// BEGIN IImportantToggleSettingInterface
virtual void GetToggleCategoryAndPropertyNames(FName& OutCategory, FName& OutProperty) const override;
virtual FText GetFalseStateLabel() const override;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Analytics/CrashReportsPrivacySettings.cpp:11
Scope (from outer to inner):
file
function UCrashReportsPrivacySettings::UCrashReportsPrivacySettings
Source code excerpt:
UCrashReportsPrivacySettings::UCrashReportsPrivacySettings(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
, bSendUnattendedBugReports(false)
{
if (GConfig)
{
GConfig->GetBool(TEXT("/Script/UnrealEd.CrashReportsPrivacySettings"), TEXT("bSendUnattendedBugReports"), bSendUnattendedBugReports, GEditorSettingsIni);
}
}
void UCrashReportsPrivacySettings::GetToggleCategoryAndPropertyNames(FName& OutCategory, FName& OutProperty) const
{
OutCategory = FName("Options");
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Analytics/CrashReportsPrivacySettings.cpp:69
Scope (from outer to inner):
file
function void UCrashReportsPrivacySettings::PostEditChangeProperty
Source code excerpt:
{
const FName PropertyName = (PropertyChangedEvent.Property != nullptr) ? PropertyChangedEvent.Property->GetFName() : NAME_None;
if (PropertyName == GET_MEMBER_NAME_CHECKED(UCrashReportsPrivacySettings, bSendUnattendedBugReports))
{
FCrashOverrideParameters Params;
Params.bSetCrashReportClientMessageText = false;
Params.bSetGameNameSuffix = false;
Params.SendUnattendedBugReports = bSendUnattendedBugReports;
FCoreDelegates::CrashOverrideParamsChanged.Broadcast(Params);
}
}
#endif
#Loc: <Workspace>/Engine/Source/Programs/CrashReportClient/Private/CrashReportClientApp.cpp:954
Scope (from outer to inner):
file
function static bool LoadTempCrashContextFromFile
Source code excerpt:
FindAndParseValue(ContextProperties, TEXT("NoDialog"), UserSettings.bNoDialog);
FindAndParseValue(ContextProperties, TEXT("SendUnattendedBugReports"), UserSettings.bSendUnattendedBugReports);
FindAndParseValue(ContextProperties, TEXT("SendUsageData"), UserSettings.bSendUsageData);
FindAndCopyValue(ContextProperties, TEXT("LogFilePath"), UserSettings.LogFilePath);
return true;
}
#Loc: <Workspace>/Engine/Source/Programs/CrashReportClient/Private/CrashReportClientApp.cpp:1202
Scope (from outer to inner):
file
function void RunCrashReportClient
Source code excerpt:
}
#endif
const bool bNoDialog = (CrashContext.UserSettings.bNoDialog || CrashContext.UserSettings.bImplicitSend) && CrashContext.UserSettings.bSendUnattendedBugReports;
FCrashReportAnalyticsSessionSummary::Get().OnCrashReportProcessing(/*bIsUserInteractive*/!bNoDialog);
const SubmitCrashReportResult Result = SendErrorReport(ErrorReport, bNoDialog, CrashContext.UserSettings.bImplicitSend);
if (bReportCrashAnalyticInfo)
{
if (FCrashReportAnalytics::IsAvailable())
#Loc: <Workspace>/Engine/Source/Programs/CrashReportClient/Private/CrashReportClientApp.cpp:1263
Scope (from outer to inner):
file
function void RunCrashReportClient
lambda-function
Source code excerpt:
auto HandleAbnormalShutdownFunc = [&TempCrashContext, &RecoveryServicePtr, &ExitCodeOpt]()
{
if (TempCrashContext.UserSettings.bSendUnattendedBugReports)
{
// Send a spoofed crash report in the case that we detect an abnormal shutdown has occurred
HandleAbnormalShutdown(TempCrashContext, MonitorPid, MonitorWritePipe, RecoveryServicePtr, ExitCodeOpt);
}
};
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/GenericPlatform/GenericPlatformCrashContext.cpp:499
Scope (from outer to inner):
file
function void FGenericCrashContext::Initialize
lambda-function
Source code excerpt:
if (InParams.SendUnattendedBugReports.IsSet())
{
NCached::UserSettings.bSendUnattendedBugReports = InParams.SendUnattendedBugReports.GetValue();
}
if (InParams.SendUsageData.IsSet())
{
NCached::UserSettings.bSendUsageData = InParams.SendUsageData.GetValue();
}
SerializeTempCrashContextToFile();
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/GenericPlatform/GenericPlatformCrashContext.cpp:725
Scope (from outer to inner):
file
function void FGenericCrashContext::InitializeFromConfig
Source code excerpt:
#if WITH_EDITOR
// Set privacy settings -> WARNING: Ensure those setting have a default values in Engine/Config/BaseEditorSettings.ini file, otherwise, they will not be found.
GConfig->GetBool(TEXT("/Script/UnrealEd.CrashReportsPrivacySettings"), TEXT("bSendUnattendedBugReports"), NCached::UserSettings.bSendUnattendedBugReports, GEditorSettingsIni);
GConfig->GetBool(TEXT("/Script/UnrealEd.AnalyticsPrivacySettings"), TEXT("bSendUsageData"), NCached::UserSettings.bSendUsageData, GEditorSettingsIni);
#elif CRASH_REPORTER_WITH_ANALYTICS
NCached::UserSettings.bSendUnattendedBugReports = true; // Give CRC permission to generate and send an 'AbnormalShutdown' report if the application died suddently, mainly to collect the logs post-mortem and count those occurrences.
NCached::UserSettings.bSendUsageData = true; // Give CRC permission to send its analytics and the application session summary (if one exist)
#endif
// Write a marker file to disk indicating the user has allowed unattended crash reports being
// sent. This allows us to submit reports for crashes during static initialization when user
// settings are not available.
FString MarkerFilePath = FPaths::Combine(FPlatformProcess::ApplicationSettingsDir(), TEXT("NotAllowedUnattendedBugReports"));
if (!NCached::UserSettings.bSendUnattendedBugReports)
{
TUniquePtr<IFileHandle> File(FPlatformFileManager::Get().GetPlatformFile().OpenWrite(*MarkerFilePath));
}
// Make sure we get updated text once the localized version is loaded
FTextLocalizationManager::Get().OnTextRevisionChangedEvent.AddStatic(&UpdateLocalizedStrings);
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/GenericPlatform/GenericPlatformCrashContext.cpp:1005
Scope (from outer to inner):
file
function void FGenericCrashContext::SerializeUserSettings
Source code excerpt:
{
AddCrashPropertyInternal(Buffer, TEXT("NoDialog"), NCached::UserSettings.bNoDialog);
AddCrashPropertyInternal(Buffer, TEXT("SendUnattendedBugReports"), NCached::UserSettings.bSendUnattendedBugReports);
AddCrashPropertyInternal(Buffer, TEXT("SendUsageData"), NCached::UserSettings.bSendUsageData);
AddCrashPropertyInternal(Buffer, FGenericCrashContext::LogFilePathTag, FPlatformOutputDevices::GetAbsoluteLogFilename()); // Don't use the value cached, it may be out of date.
}
// This function may be called in the crashing executable or in an external crash reporter program. Take care with accessing global variables vs member variables or
// fields in NCached!
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Mac/MacPlatformMisc.cpp:2336
Scope (from outer to inner):
file
function void FMacCrashContext::GenerateCrashInfoAndLaunchReporter
Source code excerpt:
}
bool bSendUnattendedBugReports = true;
if (GConfig)
{
GConfig->GetBool(TEXT("/Script/UnrealEd.CrashReportsPrivacySettings"), TEXT("bSendUnattendedBugReports"), bSendUnattendedBugReports, GEditorSettingsIni);
}
bool bSendUsageData = true;
if (GConfig)
{
GConfig->GetBool(TEXT("/Script/UnrealEd.AnalyticsPrivacySettings"), TEXT("bSendUsageData"), bSendUsageData, GEditorSettingsIni);
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Mac/MacPlatformMisc.cpp:2353
Scope (from outer to inner):
file
function void FMacCrashContext::GenerateCrashInfoAndLaunchReporter
Source code excerpt:
{
// do not send unattended reports in licensees' builds except for the editor, where it is governed by the above setting
bSendUnattendedBugReports = false;
bSendUsageData = false;
}
const bool bUnattended = GMacAppInfo.bIsUnattended || IsRunningDedicatedServer();
if (bUnattended && !bSendUnattendedBugReports)
{
bCanRunCrashReportClient = false;
}
if(bCanRunCrashReportClient)
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Mac/MacPlatformMisc.cpp:2470
Scope (from outer to inner):
file
function void FMacCrashContext::GenerateEnsureInfoAndLaunchReporter
Source code excerpt:
bool bCanRunCrashReportClient = FCString::Stristr( *(GMacAppInfo.ExecutableName), TEXT( "CrashReportClient" ) ) == nullptr;
bool bSendUnattendedBugReports = true;
if (GConfig)
{
GConfig->GetBool(TEXT("/Script/UnrealEd.CrashReportsPrivacySettings"), TEXT("bSendUnattendedBugReports"), bSendUnattendedBugReports, GEditorSettingsIni);
}
bool bSendUsageData = true;
if (GConfig)
{
GConfig->GetBool(TEXT("/Script/UnrealEd.AnalyticsPrivacySettings"), TEXT("bSendUsageData"), bSendUsageData, GEditorSettingsIni);
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Mac/MacPlatformMisc.cpp:2487
Scope (from outer to inner):
file
function void FMacCrashContext::GenerateEnsureInfoAndLaunchReporter
Source code excerpt:
{
// do not send unattended reports in licensees' builds except for the editor, where it is governed by the above setting
bSendUnattendedBugReports = false;
bSendUsageData = false;
}
const bool bUnattended = GMacAppInfo.bIsUnattended || !IsInteractiveEnsureMode() || IsRunningDedicatedServer();
if (bUnattended && !bSendUnattendedBugReports)
{
bCanRunCrashReportClient = false;
}
if(bCanRunCrashReportClient)
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformCrashContext.cpp:533
Scope (from outer to inner):
file
function void FUnixCrashContext::GenerateCrashInfoAndLaunchReporter
Source code excerpt:
/* Table showing the desired behavior when wanting to start the CRC or not.
* based on an *.ini setting for bSendUnattendedBugReports or bAgreeToCrashUpload and whether or not we are unattended
*
* Unattended | AgreeToUpload | SendUnattendedBug || Start CRC
* ------------------------------------------------------------
* 1 | 1 | 1 || 1
* 1 | 1 | 0 || 1
* 1 | 0 | 1 || 1
* 1 | 0 | 0 || 0
* 0 | 1 | 1 || 1
* 0 | 1 | 0 || 1
* 0 | 0 | 1 || 1
* 0 | 0 | 0 || 1
*
*/
// Suppress the user input dialog if we're running in unattended mode
bool bUnattended = FApp::IsUnattended() || (!IsInteractiveEnsureMode() && bReportingNonCrash) || IsRunningDedicatedServer();
#if PLATFORM_LINUX
// On Linux, count not having a X11 display as also running unattended, because CRC will switch to the unattended mode in that case
if (!bUnattended)
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformCrashContext.cpp:571
Scope (from outer to inner):
file
function void FUnixCrashContext::GenerateCrashInfoAndLaunchReporter
Source code excerpt:
// By default we wont upload unless the *.ini has set this to true
bool bSendUnattendedBugReports = false;
if (GConfig)
{
GConfig->GetBool(TEXT("/Script/UnrealEd.CrashReportsPrivacySettings"), TEXT("bSendUnattendedBugReports"), bSendUnattendedBugReports, GEditorSettingsIni);
}
// Controls if we want analytics in the crash report client
bool bSendUsageData = true;
if (GConfig)
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformCrashContext.cpp:594
Scope (from outer to inner):
file
function void FUnixCrashContext::GenerateCrashInfoAndLaunchReporter
Source code excerpt:
{
// do not send unattended reports in licensees' builds except for the editor, where it is governed by the above setting
bSendUnattendedBugReports = false;
bAgreeToCrashUpload = false;
bSendUsageData = false;
}
bool bSkipCRC = bUnattended && !bSendUnattendedBugReports && !bAgreeToCrashUpload;
if (!bSkipCRC)
{
const TCHAR* TypeString = TEXT("crash");
switch(Type)
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Windows/WindowsPlatformCrashContext.cpp:609
Scope (from outer to inner):
file
namespace anonymous
function int32 ReportCrashForMonitor
Source code excerpt:
bool bNoDialog = ReportUI == EErrorReportUI::ReportInUnattendedMode;
bNoDialog |= UE::Core::Private::CVarForceCrashReportDialogOff.GetValueOnAnyThread() == true;
bool bSendUnattendedBugReports = true;
bool bSendUsageData = true;
bool bCanSendCrashReport = true;
// Some projects set this value in non editor builds to automatically send error reports unattended, but display
// a plain message box in the crash report client. See CRC app code for details.
bool bImplicitSend = false;
// IsRunningDedicatedServer will check command line arguments, but only for editor builds.
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Windows/WindowsPlatformCrashContext.cpp:633
Scope (from outer to inner):
file
namespace anonymous
function int32 ReportCrashForMonitor
Source code excerpt:
if (GConfig)
{
GConfig->GetBool(TEXT("/Script/UnrealEd.CrashReportsPrivacySettings"), TEXT("bSendUnattendedBugReports"), bSendUnattendedBugReports, GEditorSettingsIni);
GConfig->GetBool(TEXT("/Script/UnrealEd.AnalyticsPrivacySettings"), TEXT("bSendUsageData"), bSendUsageData, GEditorSettingsIni);
#if !UE_EDITOR
if (ReportUI != EErrorReportUI::ReportInUnattendedMode)
{
// Only check if we are in a non-editor build
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Windows/WindowsPlatformCrashContext.cpp:652
Scope (from outer to inner):
file
namespace anonymous
function int32 ReportCrashForMonitor
Source code excerpt:
if (::PathFileExistsW(*NotAllowedUnattendedBugReportMarkerPath))
{
bSendUnattendedBugReports = false;
}
}
#if !UE_EDITOR
// NOTE: A blueprint-only game packaged from a vanilla engine downloaded from Epic Game Store isn't considered a 'Licensee' version because the engine was built by Epic.
// There is no way at the moment do distinguish this case properly.
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Windows/WindowsPlatformCrashContext.cpp:662
Scope (from outer to inner):
file
namespace anonymous
function int32 ReportCrashForMonitor
Source code excerpt:
{
// do not send unattended reports in licensees' builds except for the editor, where it is governed by the above setting
bSendUnattendedBugReports = false;
bSendUsageData = false;
}
#endif
if (bNoDialog && !bSendUnattendedBugReports)
{
// If we shouldn't display a dialog (like for ensures) and the user
// does not allow unattended bug reports we cannot send the report.
bCanSendCrashReport = false;
}
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Windows/WindowsPlatformCrashContext.cpp:680
Scope (from outer to inner):
file
namespace anonymous
function int32 ReportCrashForMonitor
Source code excerpt:
SharedContext->UserSettings.bNoDialog = bNoDialog;
SharedContext->UserSettings.bSendUnattendedBugReports = bSendUnattendedBugReports;
SharedContext->UserSettings.bSendUsageData = bSendUsageData;
SharedContext->UserSettings.bImplicitSend = bImplicitSend;
SharedContext->SessionContext.bIsExitRequested = IsEngineExitRequested();
FCString::Strncpy(SharedContext->ErrorMessage, ErrorMessage, CR_MAX_ERROR_MESSAGE_CHARS);
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Windows/WindowsPlatformCrashContext.cpp:832
Scope (from outer to inner):
file
namespace anonymous
function int32 ReportCrashUsingCrashReportClient
Source code excerpt:
#endif
bool bSendUnattendedBugReports = true;
if (GConfig)
{
GConfig->GetBool(TEXT("/Script/UnrealEd.CrashReportsPrivacySettings"), TEXT("bSendUnattendedBugReports"), bSendUnattendedBugReports, GEditorSettingsIni);
}
// Controls if we want analytics in the crash report client
bool bSendUsageData = true;
if (GConfig)
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/Windows/WindowsPlatformCrashContext.cpp:851
Scope (from outer to inner):
file
namespace anonymous
function int32 ReportCrashUsingCrashReportClient
Source code excerpt:
{
// do not send unattended reports in licensees' builds except for the editor, where it is governed by the above setting
bSendUnattendedBugReports = false;
bSendUsageData = false;
}
#endif
if (bNoDialog && !bSendUnattendedBugReports)
{
bCanRunCrashReportClient = false;
}
if( bCanRunCrashReportClient )
{
#Loc: <Workspace>/Engine/Source/Runtime/Core/Public/GenericPlatform/GenericPlatformCrashContext.h:215
Scope: file
Source code excerpt:
{
bool bNoDialog = false;
bool bSendUnattendedBugReports = false;
bool bSendUsageData = false;
bool bImplicitSend = false;
TCHAR LogFilePath[CR_MAX_DIRECTORY_CHARS];
};
/**