You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
Engine/Editor changes: - Split the Editor summary session in two, one summary for the Engine properties and one for the Editor specific properties. Made it easy to extend the Engine summary to create other summaries. - Made the summary sender as agnostics as possible of the keys it sends. - Fixed the system wide lock contention between the process when persisting a session. (On problem caused by the lock is UE-114315). - Fixed concurrent issue when saving the summary sessions on Linux/Mac - Fixed performance issue when saving the summary session on Linux/Mac. This enable saving at higher frequency. - Fixed cases where the same session summary is sent more than once. - Fixed Windows registry key overflow that could happens if we accumulated too many sessions (in theory, this can happen) - Made adding new properties to the summary easy and private to the implementation. - Brought the Linux/Mac implementation closer to Windows implementation. - Reduced memory allocation, especially when the session records a crash. - Improved chances to send the summary non-delayed by allowing the Editor to send the reports if CRC died unexpectedly. - Generalized the support to collect and aggregate analytics from helper processes. For example, CRC already collects analytics that is merged with the Editor summary as information supplement - Reserved the disk space required to store the summary ahead of time to prevent failing later. - Increased frequency at which the summary is persisted because saving the summary is more efficient. (About every 10 seconds rather than every minutes). - Added unit tests CrashReportClient changes: - Created a 'session summary' from the CRC point of view to merge with the Editor summary. - Moved analytics collection in a separated class to make the crash reporting code leaner and less noisy with all the analytics - Merged the CRC diagnostic logger in the class collecting CRC analytics summary and make the diagnostic log a property in the summary. - Collected analytics (on behalf of Editor) in a background thread because CRC main thread can be blocked collecting a crash, so it doesn't pay attention to other things - Added MonitorBatteryLevel and MonitorOnACPower summary properties on Windows. Collected on CRC background thread (never blocked, so we reduce changes to miss the battery running out) - Added MonitorSessionDuration summary property to track now long CRC ran. - Added MonitorQuitSignalRecv summary property to detect when CRC is soft killed like: taskkill /PID 1234 - Added MonitorIsReportingCrash summary property to track when CRC dies reporting a crash. - Added MonitorIsCollectingCrash summary property to track when CRC dies collecting a crash artifacts. - Added IsProcessingCrash summary property to track when CRC dies processing a crash. - Added MonitorCrashed summary property to track when CRC exception handler was triggered. - Added MonitorWasShutdown summary property to track when CRC summary was shutdown - Added MonitorLoggingOut summary property to track when CRC died because the user was logging out (or as result of shutting down or restarting the computer). - More accurate value for DeathTimestamp summary property because this is now captured in CRC background thread (which cannot be busy handling a crash) - Added crash processing timing to CRC diagnostic logs (how long it takes to collect/process a crash). #rb Jamie.Dale, Wes.Hunt, Johan.Berg #jira UETOOL-3500 #jira UE-114315 [CL 16324612 by Patrick Laflamme in ue5-main branch]
135 lines
5.0 KiB
C++
135 lines
5.0 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "GenericPlatform/GenericPlatformCrashContext.h"
|
|
#include "HAL/PlatformProcess.h"
|
|
#include "Misc/OutputDevice.h"
|
|
#include "Templates/Function.h"
|
|
#include "CrashReportClientDefines.h"
|
|
#include <atomic>
|
|
|
|
class IAnalyticsPropertyStore;
|
|
class IAnalyticsProviderET;
|
|
class FAnalyticsSessionSummaryManager;
|
|
class FThread;
|
|
|
|
/**
|
|
* Creates a summary of CRC session for analytics purpose. The summary should be merged with the
|
|
* monitored application one.
|
|
*/
|
|
class FCrashReportAnalyticsSessionSummary : public FOutputDevice
|
|
{
|
|
public:
|
|
/** Return the summary instance. */
|
|
static FCrashReportAnalyticsSessionSummary& Get();
|
|
|
|
/** Initialize the summary. The implementation do nothing unless the instance is successfully initialized. */
|
|
void Initialize(const FString& ProcessGroupId, uint32 ForProcessId);
|
|
|
|
/** Shuts down and submits the summary if a non-null provider is specified and invoke HandleAbnormalShutdownFn if bound and an abnormal shutdown was detected. */
|
|
void Shutdown(IAnalyticsProviderET* AnalyticsProvider = nullptr, TFunction<void()> HandleAbnormalShutdownFn = TFunction<void()>());
|
|
|
|
//~ FOutputDevice interface
|
|
virtual void Serialize(const TCHAR* V, ELogVerbosity::Type Verbosity, const FName& Category) override;
|
|
virtual void Serialize(const TCHAR* V, ELogVerbosity::Type Verbosity, const FName& Category, const double Time) override;
|
|
virtual bool CanBeUsedOnAnyThread() const override;
|
|
virtual bool CanBeUsedOnMultipleThreads() const override;
|
|
|
|
/** Logs an events in the analytics session summary diagnostic log. The event text is expected to be short and concise. */
|
|
void LogEvent(const TCHAR* Event, bool bForwardToUELog = true);
|
|
|
|
/** Logs an events in the analytics session summary diagnostic log. The event text is expected to be short and concise. */
|
|
void LogEvent(const FString& Event);
|
|
|
|
/** Invoked when monitored application death was detected. */
|
|
void OnMonitoredAppDeath(FProcHandle& Handle);
|
|
|
|
/** Invoked by the unhandled exception handler while CRC is crashing. */
|
|
void OnCrcCrashing(int32 ExceptCode);
|
|
|
|
/** Invoked when the user is logging out. This is also called if the computer is shutting down or restarting. */
|
|
void OnUserLoggingOut();
|
|
|
|
/** Invoked when the system gently signal CRC to quit. */
|
|
void OnQuitSignal();
|
|
|
|
/** Invoked when CRC starts to process a crash/ensure/stall.*/
|
|
void OnCrashReportStarted(ECrashContextType Type, const TCHAR* ErrorMsg);
|
|
|
|
/** Invoked when CRC starts collecting the crash artifacts. */
|
|
void OnCrashReportCollecting();
|
|
|
|
/** Invoked when CRC starts the process to submit the crash report (this also includes showing the dialog to user in needed. */
|
|
void OnCrashReportProcessing(bool bUserInteractive);
|
|
|
|
/** Invoked when CRC finished handling a crash report and resume its main loop. */
|
|
void OnCrashReportCompleted(bool bSubmitted);
|
|
|
|
private:
|
|
/** Returns whether the analytics summary is enabled or not. */
|
|
static bool IsEnabled() { return CRASH_REPORT_WITH_MTBF != 0; }
|
|
|
|
/** Returns true if the analytics session summary is valid. */
|
|
bool IsValid() const;
|
|
|
|
/** Creates the summary sessions. */
|
|
FCrashReportAnalyticsSessionSummary();
|
|
|
|
/** Appends a log entry to the log buffer, rotate the buffer if full and flush it to file. */
|
|
void AppendLog(const TCHAR* Event);
|
|
|
|
/** Flush CRC analytics summary file to disk. */
|
|
void Flush();
|
|
|
|
/** Invoked by the core when the application is about to terminate. */
|
|
void OnApplicationWillTerminate();
|
|
|
|
/** Invoked by the core when a system error is detected, like fatal logs. */
|
|
void OnHandleSystemError();
|
|
|
|
/** Invoked periodically by the monitoring thread to update the power status (Battery/AC Power). */
|
|
bool UpdatePowerStatus();
|
|
|
|
private:
|
|
/** Serialize access to the diagnostic logs. */
|
|
FCriticalSection LoggerLock;
|
|
|
|
/** The CRC session summary store. */
|
|
TSharedPtr<IAnalyticsPropertyStore> PropertyStore;
|
|
|
|
/** The session summary manager. */
|
|
TUniquePtr<FAnalyticsSessionSummaryManager> SessionSummaryManager;
|
|
|
|
/** Contains the rotating diagnostic log entries. */
|
|
FString DiagnosticLog;
|
|
|
|
/** Runs in background to collect CRC analytics because the main thread might be busy handling a crash and important event could be missed. */
|
|
TUniquePtr<FThread> AnalyticsThread;
|
|
|
|
/** The CRC startup time, i.e. when the summary is successfully initialized. */
|
|
double SessionStartTimeSecs;
|
|
|
|
/** Time at which the last crash report started. */
|
|
double CrashReportStartTimeSecs = 0.0;
|
|
|
|
/** Time at which collecting the artifacts of the last crash started. */
|
|
double CrashReportCollectingStartTimeSecs = 0.0;
|
|
|
|
/** Time at which processing the last crash started. */
|
|
double CrashReportProcessingStartTimeSecs = 0.0;
|
|
|
|
/** Prevent a reentrency in the diagnostic logger. */
|
|
bool bLoggerReentrantGuard = false;
|
|
|
|
/** Flag if the session is usable. */
|
|
bool bIsValid = false;
|
|
|
|
/** Indicates whether the monitored application death is reported. */
|
|
std::atomic<bool> bMonitoredAppDeathRecorded;
|
|
|
|
/** Used to signal the analytics thread to exit. */
|
|
std::atomic<bool> bShutdown;
|
|
};
|