Unfatal Segfaults

This commit is contained in:
Eladash 2021-01-27 17:50:39 +02:00 committed by Ivan
parent 53267e283b
commit 28feea0447

View File

@ -1403,7 +1403,6 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
// Hack: allocate memory in case the emulator is stopping // Hack: allocate memory in case the emulator is stopping
const auto hack_alloc = [&]() const auto hack_alloc = [&]()
{ {
// If failed the value remains true and std::terminate should be called
g_tls_access_violation_recovered = true; g_tls_access_violation_recovered = true;
const auto area = vm::reserve_map(vm::any, addr & -0x10000, 0x10000); const auto area = vm::reserve_map(vm::any, addr & -0x10000, 0x10000);
@ -1529,7 +1528,8 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
if (sending_error) if (sending_error)
{ {
vm_log.fatal("Unknown error 0x%x while trying to pass page fault.", +sending_error); vm_log.error("Unknown error 0x%x while trying to pass page fault.", +sending_error);
return false;
} }
else else
{ {
@ -1548,7 +1548,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
// Reschedule, test cpu state and try recovery if stopped // Reschedule, test cpu state and try recovery if stopped
if (cpu->test_stopped() && !hack_alloc()) if (cpu->test_stopped() && !hack_alloc())
{ {
std::terminate(); return false;
} }
return true; return true;
@ -1569,7 +1569,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
if (cpu->check_state() && !hack_alloc()) if (cpu->check_state() && !hack_alloc())
{ {
std::terminate(); return false;
} }
return true; return true;
@ -1606,7 +1606,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
if (Emu.IsStopped() && !hack_alloc()) if (Emu.IsStopped() && !hack_alloc())
{ {
std::terminate(); return false;
} }
return true; return true;
@ -1676,8 +1676,6 @@ static LONG exception_filter(PEXCEPTION_POINTERS pExp) noexcept
if (thread_ctrl::get_current()) if (thread_ctrl::get_current())
{ {
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name()); fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
sys_log.notice("\n%s", dump_useful_thread_info());
} }
// TODO: Report full thread name if not an emu thread // TODO: Report full thread name if not an emu thread
@ -1739,14 +1737,7 @@ static LONG exception_filter(PEXCEPTION_POINTERS pExp) noexcept
// TODO: print registers and the callstack // TODO: print registers and the callstack
sys_log.fatal("\n%s", msg); thread_ctrl::emergency_exit(msg);
if (!IsDebuggerPresent())
{
report_fatal_error(msg);
}
return EXCEPTION_CONTINUE_SEARCH;
} }
const bool s_exception_handler_set = []() -> bool const bool s_exception_handler_set = []() -> bool
@ -1810,24 +1801,25 @@ static void signal_handler(int sig, siginfo_t* info, void* uct) noexcept
if (thread_ctrl::get_current()) if (thread_ctrl::get_current())
{ {
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name()); fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
sys_log.notice("\n%s", dump_useful_thread_info());
} }
// TODO: Report full thread name if not an emu thread // TODO: Report full thread name if not an emu thread
fmt::append(msg, "Thread id = %s.\n", std::this_thread::get_id()); fmt::append(msg, "Thread id = %s.\n", std::this_thread::get_id());
sys_log.fatal("\n%s", msg);
std::fprintf(stderr, "%s\n", msg.c_str());
if (IsDebuggerPresent()) if (IsDebuggerPresent())
{ {
sys_log.fatal("\n%s", msg);
std::fprintf(stderr, "%s\n", msg.c_str());
sys_log.notice("\n%s", dump_useful_thread_info());
// Convert to SIGTRAP // Convert to SIGTRAP
raise(SIGTRAP); raise(SIGTRAP);
return; return;
} }
report_fatal_error(msg); thread_ctrl::emergency_exit(msg);
} }
void sigpipe_signaling_handler(int) void sigpipe_signaling_handler(int)