void FLinuxCrashContext::InitFromSignal(int32 InSignal, siginfo_t* InInfo, void* InContext) { Signal = InSignal; Info = InInfo; Context = reinterpret_cast< ucontext_t* >( InContext ); FCString::Strcat(SignalDescription, ARRAY_COUNT( SignalDescription ) - 1, *DescribeSignal(Signal, Info)); }
void FLinuxCrashContext::InitFromSignal(int32 InSignal, siginfo_t* InInfo, void* InContext) { Signal = InSignal; Info = InInfo; Context = reinterpret_cast< ucontext_t* >( InContext ); // open ourselves for examination if (!FParse::Param( FCommandLine::Get(), TEXT(CMDARG_SUPPRESS_DWARF_PARSING))) { ExeFd = open("/proc/self/exe", O_RDONLY); if (ExeFd >= 0) { Dwarf_Error ErrorInfo; // allocate DWARF debug descriptor if (dwarf_init(ExeFd, DW_DLC_READ, NULL, NULL, &DebugInfo, &ErrorInfo) == DW_DLV_OK) { // get ELF descritor if (dwarf_get_elf(DebugInfo, &ElfHdr, &ErrorInfo) != DW_DLV_OK) { dwarf_finish(DebugInfo, &ErrorInfo); DebugInfo = NULL; close(ExeFd); ExeFd = -1; } } else { DebugInfo = NULL; close(ExeFd); ExeFd = -1; } } } FCString::Strcat(SignalDescription, ARRAY_COUNT( SignalDescription ) - 1, *DescribeSignal(Signal, Info)); }
void CreateExceptionInfoString(int32 Signal, siginfo_t* Info) { FString ErrorString = TEXT("Unhandled Exception: "); ErrorString += DescribeSignal(Signal, Info); FCString::Strncpy(GErrorExceptionDescription, *ErrorString, FMath::Min(ErrorString.Len() + 1, (int32)ARRAY_COUNT(GErrorExceptionDescription))); }