mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-25 12:12:50 +01:00
Output all fatal log messages to Console/debugger as well
This commit is contained in:
parent
a1d31f640a
commit
73320d4180
@ -1810,7 +1810,6 @@ static void signal_handler(int /*sig*/, siginfo_t* info, void* uct) noexcept
|
|||||||
if (IsDebuggerPresent())
|
if (IsDebuggerPresent())
|
||||||
{
|
{
|
||||||
sys_log.fatal("\n%s", msg);
|
sys_log.fatal("\n%s", msg);
|
||||||
std::fprintf(stderr, "%s\n", msg.c_str());
|
|
||||||
|
|
||||||
sys_log.notice("\n%s", dump_useful_thread_info());
|
sys_log.notice("\n%s", dump_useful_thread_info());
|
||||||
|
|
||||||
@ -2511,12 +2510,9 @@ void thread_base::exec()
|
|||||||
|
|
||||||
sig_log.fatal("Thread terminated due to fatal error: %s", reason);
|
sig_log.fatal("Thread terminated due to fatal error: %s", reason);
|
||||||
|
|
||||||
std::fprintf(stderr, "Thread '%s' terminated due to fatal error: %s\n", g_tls_log_prefix().c_str(), std::string(reason).c_str());
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (IsDebuggerPresent())
|
if (IsDebuggerPresent())
|
||||||
{
|
{
|
||||||
OutputDebugStringA(fmt::format("Thread '%s' terminated due to fatal error: %s\n", g_tls_log_prefix(), reason).c_str());
|
|
||||||
__debugbreak();
|
__debugbreak();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -95,7 +95,7 @@ LOG_CHANNEL(q_debug, "QDEBUG");
|
|||||||
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())
|
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())
|
||||||
[[maybe_unused]] const auto con_out = freopen("conout$", "w", stderr);
|
[[maybe_unused]] const auto con_out = freopen("conout$", "w", stderr);
|
||||||
#endif
|
#endif
|
||||||
std::fprintf(stderr, "RPCS3: %.*s\n", static_cast<int>(text.size()), text.data());
|
std::cerr << fmt::format("RPCS3: %s\n", text);
|
||||||
std::abort();
|
std::abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ LOG_CHANNEL(q_debug, "QDEBUG");
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::fprintf(stderr, "RPCS3: %.*s\n", static_cast<int>(text.size()), text.data());
|
std::cerr << fmt::format("RPCS3: %s\n", text);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto show_report = [](std::string_view text)
|
auto show_report = [](std::string_view text)
|
||||||
@ -183,14 +183,46 @@ LOG_CHANNEL(q_debug, "QDEBUG");
|
|||||||
std::abort();
|
std::abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pause_on_fatal final : logs::listener
|
struct fatal_errors_listener final : logs::listener
|
||||||
{
|
{
|
||||||
~pause_on_fatal() override = default;
|
~fatal_errors_listener() override = default;
|
||||||
|
|
||||||
void log(u64 /*stamp*/, const logs::message& msg, const std::string& /*prefix*/, const std::string& /*text*/) override
|
void log(u64 /*stamp*/, const logs::message& msg, const std::string& prefix, const std::string& text) override
|
||||||
{
|
{
|
||||||
if (msg.sev == logs::level::fatal)
|
if (msg.sev == logs::level::fatal)
|
||||||
{
|
{
|
||||||
|
std::string _msg = "RPCS3: ";
|
||||||
|
|
||||||
|
if (!prefix.empty())
|
||||||
|
{
|
||||||
|
_msg += prefix;
|
||||||
|
_msg += ": ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.ch && '\0' != *msg.ch->name)
|
||||||
|
{
|
||||||
|
_msg += msg.ch->name;
|
||||||
|
_msg += ": ";
|
||||||
|
}
|
||||||
|
|
||||||
|
_msg += text;
|
||||||
|
_msg += '\n';
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
// If launched from CMD
|
||||||
|
if (AttachConsole(ATTACH_PARENT_PROCESS))
|
||||||
|
[[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stderr);
|
||||||
|
#endif
|
||||||
|
// Output to error stream as is
|
||||||
|
std::cerr << _msg;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (IsDebuggerPresent())
|
||||||
|
{
|
||||||
|
// Output string to attached debugger
|
||||||
|
OutputDebugStringA(_msg.c_str());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
// Pause emulation if fatal error encountered
|
// Pause emulation if fatal error encountered
|
||||||
Emu.Pause();
|
Emu.Pause();
|
||||||
}
|
}
|
||||||
@ -419,7 +451,7 @@ int main(int argc, char** argv)
|
|||||||
log_file = logs::make_file_listener(fs::get_cache_dir() + "RPCS3.log", stats.avail_free / 4);
|
log_file = logs::make_file_listener(fs::get_cache_dir() + "RPCS3.log", stats.avail_free / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::unique_ptr<logs::listener> log_pauser = std::make_unique<pause_on_fatal>();
|
static std::unique_ptr<logs::listener> log_pauser = std::make_unique<fatal_errors_listener>();
|
||||||
logs::listener::add(log_pauser.get());
|
logs::listener::add(log_pauser.get());
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -477,14 +509,14 @@ int main(int argc, char** argv)
|
|||||||
rlim.rlim_max = 4096;
|
rlim.rlim_max = 4096;
|
||||||
#ifdef RLIMIT_NOFILE
|
#ifdef RLIMIT_NOFILE
|
||||||
if (::setrlimit(RLIMIT_NOFILE, &rlim) != 0)
|
if (::setrlimit(RLIMIT_NOFILE, &rlim) != 0)
|
||||||
std::fprintf(stderr, "Failed to set max open file limit (4096).\n");
|
std::cerr << "Failed to set max open file limit (4096).\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rlim.rlim_cur = 0x80000000;
|
rlim.rlim_cur = 0x80000000;
|
||||||
rlim.rlim_max = 0x80000000;
|
rlim.rlim_max = 0x80000000;
|
||||||
#ifdef RLIMIT_MEMLOCK
|
#ifdef RLIMIT_MEMLOCK
|
||||||
if (::setrlimit(RLIMIT_MEMLOCK, &rlim) != 0)
|
if (::setrlimit(RLIMIT_MEMLOCK, &rlim) != 0)
|
||||||
std::fprintf(stderr, "Failed to set RLIMIT_MEMLOCK size to 2 GiB. Try to update your system configuration.\n");
|
std::cerr << "Failed to set RLIMIT_MEMLOCK size to 2 GiB. Try to update your system configuration.\n";
|
||||||
#endif
|
#endif
|
||||||
// Work around crash on startup on KDE: https://bugs.kde.org/show_bug.cgi?id=401637
|
// Work around crash on startup on KDE: https://bugs.kde.org/show_bug.cgi?id=401637
|
||||||
setenv( "KDE_DEBUG", "1", 0 );
|
setenv( "KDE_DEBUG", "1", 0 );
|
||||||
|
Loading…
Reference in New Issue
Block a user