Files
UnrealEngine/Engine/Source/Developer/CrashDebugHelper/Public/CrashDebugHelper.h
2025-05-18 13:04:45 +08:00

241 lines
5.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Containers/Array.h"
#include "Containers/UnrealString.h"
#include "CoreMinimal.h"
#include "HAL/Platform.h"
#include "Templates/SharedPointer.h"
class FArchive;
enum EProcessorArchitecture
{
PA_UNKNOWN,
PA_ARM,
PA_X86,
PA_X64,
};
/**
* Details of a module from a crash dump
*/
class FCrashModuleInfo
{
public:
FString Report;
FString Name;
FString Extension;
uint64 BaseOfImage = 0;
uint32 SizeOfImage = 0;
uint16 Major = 0;
uint16 Minor = 0;
uint16 Patch = 0;
uint16 Revision = 0;
};
/**
* Details about a thread from a crash dump
*/
class FCrashThreadInfo
{
public:
FString Report;
FString ThreadName;
uint32 ThreadId = 0;
uint32 SuspendCount = 0;
bool IsCrashing = false;
TArray<uint64> CallStack;
FString PortableCallStackString;
};
/**
* Details about the exception in the crash dump
*/
class FCrashExceptionInfo
{
public:
FString Report;
uint32 ProcessId = 0;
uint32 ThreadId = 0;
uint32 Code = 0;
FString ExceptionString;
TArray<FString> CallStackString;
TArray<FString> PortableCallStackString;
};
/**
* Details about the system the crash dump occurred on
*/
class FCrashSystemInfo
{
public:
FString Report;
EProcessorArchitecture ProcessorArchitecture = PA_UNKNOWN;
uint32 ProcessorCount = 0;
uint16 OSMajor = 0;
uint16 OSMinor = 0;
uint16 OSBuild = 0;
uint16 OSRevision = 0;
};
// #TODO 2015-07-24 Refactor
/** A platform independent representation of a crash */
class CRASHDEBUGHELPER_API FCrashInfo
{
public:
enum
{
/** An invalid changelist, something went wrong. */
INVALID_CHANGELIST = -1,
};
/** Report log. */
FString Report;
/** The depot name, indicate where the executables and symbols are stored. */
FString DepotName;
/** Product version, based on FEngineVersion. */
FString EngineVersion;
/** Build version string. */
FString BuildVersion;
/** CL built from. */
int32 BuiltFromCL = INVALID_CHANGELIST;
/** The label the describes the executables and symbols. */
FString LabelName;
/** The network path where the executables are stored. */
FString ExecutablesPath;
/** The network path where the symbols are stored. */
FString SymbolsPath;
FString SourceFile;
uint32 SourceLineNumber = 0;
TArray<FString> SourceContext;
/** Only modules names, retrieved from the minidump file. */
TArray<FString> ModuleNames;
FCrashSystemInfo SystemInfo;
FCrashExceptionInfo Exception;
TArray<FCrashThreadInfo> Threads;
TArray<FCrashModuleInfo> Modules;
FString PlatformName;
FString PlatformVariantName;
/**
* Generate a report for the crash in the requested path
*/
void GenerateReport( const FString& DiagnosticsPath );
/**
* Handle logging
*/
void Log( FString Line );
private:
/**
* Convert the processor architecture to a human readable string
*/
static const TCHAR* GetProcessorArchitecture( EProcessorArchitecture PA );
/**
* Write a line as UTF-8 to a file
*/
static void WriteLine(FArchive* ReportFile, const TCHAR* Line = nullptr);
static void WriteLine(FArchive* ReportFile, const FString& Line);
};
/** Helper structure for tracking crash debug information */
struct FCrashDebugInfo
{
/** The name of the crash dump file */
FString CrashDumpName;
/** The engine version of the crash dump build */
int32 EngineVersion;
/** The platform of the crash dump build */
FString PlatformName;
/** The source control label of the crash dump build */
FString SourceControlLabel;
};
/** The public interface for the crash dump handler singleton. */
class CRASHDEBUGHELPER_API ICrashDebugHelper
{
public:
/** Virtual destructor */
virtual ~ICrashDebugHelper() = default;
/**
* Initialize the helper
*
* @return bool true if successful, false if not
*/
virtual bool Init();
/**
* Parse the given crash dump, determining EngineVersion of the build that produced it - if possible.
*
* @param InCrashDumpName The crash dump file to process
* @param OutCrashDebugInfo The crash dump info extracted from the file
*
* @return bool true if successful, false if not
*
* Only used by Mac, to be removed.
*/
virtual bool ParseCrashDump(const FString& InCrashDumpName, FCrashDebugInfo& OutCrashDebugInfo)
{
return false;
}
/**
* Parse the given crash dump, and generate a report.
*
* @param InCrashDumpName The crash dump file to process
*
* @return bool true if successful, false if not
*/
virtual bool CreateMinidumpDiagnosticReport( const FString& InCrashDumpName )
{
return false;
}
/**
* Extract lines from a source file, and add to the crash report.
*/
virtual void AddSourceToReport();
protected:
/**
* Load the given ANSI text file to an array of strings - one FString per line of the file.
* Intended for use in simple text parsing actions
*
* @param OutStrings The array of FStrings to fill in
*
* @return bool true if successful, false if not
*/
bool ReadSourceFile( TArray<FString>& OutStrings );
public:
/** A platform independent representation of a crash */
FCrashInfo CrashInfo;
protected:
/** Indicates that the crash handler is ready to do work */
bool bInitialized = false;
};