diff --git a/stratosphere/creport/source/creport_crash_report.cpp b/stratosphere/creport/source/creport_crash_report.cpp index 130b20671..70a686c67 100644 --- a/stratosphere/creport/source/creport_crash_report.cpp +++ b/stratosphere/creport/source/creport_crash_report.cpp @@ -2,6 +2,10 @@ #include "creport_crash_report.hpp" #include "creport_debug_types.hpp" +void CrashReport::SaveReport() { + /* TODO: Save the report to the SD card. */ +} + void CrashReport::BuildReport(u64 pid, bool has_extra_info) { this->has_extra_info = has_extra_info; if (OpenProcess(pid)) { diff --git a/stratosphere/creport/source/creport_crash_report.hpp b/stratosphere/creport/source/creport_crash_report.hpp index 1aa96e4e6..2d9e8586f 100644 --- a/stratosphere/creport/source/creport_crash_report.hpp +++ b/stratosphere/creport/source/creport_crash_report.hpp @@ -4,6 +4,20 @@ #include "creport_debug_types.hpp" +enum class CrashReportResult : Result { + UndefinedInstruction = 0x00A8, + InstructionAbort = 0x02A8, + DataAbort = 0x04A8, + AlignmentFault = 0x06A8, + DebuggerAttached = 0x08A8, + BreakPoint = 0x0AA8, + UserBreak = 0x0CA8, + DebuggerBreak = 0x0EA8, + BadSvc = 0x10A8, + UnknownNine = 0x12A8, + IncompleteReport = 0xC6A8, +}; + class CrashReport { private: Handle debug_handle; @@ -16,15 +30,20 @@ class CrashReport { u64 userdata_5x_size; public: - CrashReport() : debug_handle(INVALID_HANDLE), result(0xC6A8), process_info({0}) { } + CrashReport() : debug_handle(INVALID_HANDLE), result((Result)CrashReportResult::IncompleteReport), process_info({0}) { } void BuildReport(u64 pid, bool has_extra_info); + void SaveReport(); void ProcessExceptions(); Result GetResult() { return this->result; } + bool WasSuccessful() { + return this->result != (Result)CrashReportResult::IncompleteReport; + } + bool OpenProcess(u64 pid) { return R_SUCCEEDED(svcDebugActiveProcess(&debug_handle, pid)); } @@ -47,6 +66,10 @@ class CrashReport { bool Is64Bit() { return (process_info.flags & 0x01) != 0; } + + bool IsUserBreak() { + return this->result == (Result)CrashReportResult::UserBreak; + } private: void HandleAttachProcess(DebugEventInfo &d); void HandleException(DebugEventInfo &d); diff --git a/stratosphere/creport/source/creport_main.cpp b/stratosphere/creport/source/creport_main.cpp index 094414357..bf257d5b2 100644 --- a/stratosphere/creport/source/creport_main.cpp +++ b/stratosphere/creport/source/creport_main.cpp @@ -94,12 +94,27 @@ int main(int argc, char **argv) { /* Try to debug the crashed process. */ g_Creport.BuildReport(crashed_pid, argv[1][0] == '1'); - - if (R_SUCCEEDED(nsdevInitialize())) { - nsdevTerminateProcess(crashed_pid); - nsdevExit(); + if (g_Creport.WasSuccessful()) { + if (R_SUCCEEDED(nsdevInitialize())) { + nsdevTerminateProcess(crashed_pid); + nsdevExit(); + } + + /* Don't fatal if we have extra info. */ + if (kernelAbove500()) { + if (g_Creport.IsApplication()) { + return 0; + } + } else if (argv[1][0] == '1') { + return 0; + } + + /* Also don't fatal if we're a user break. */ + if (g_Creport.IsUserBreak()) { + return 0; + } + + fatalWithType(g_Creport.GetResult(), FatalType_ErrorScreen); } - /* TODO: fatalWithType(, FatalType_ErrorScreen); */ - fatalWithType(0, FatalType_ErrorScreen); } \ No newline at end of file