Files
CPP_Core/psc_global_include/Fail_Fast.cpp
T
2026-06-16 10:56:40 +08:00

67 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "Core/Base/global_include.h"
#include "Core/spdlog/export.h"
#include "Core/system/export.h"
#include "export.h"
#include <iostream>
#include <utility>
namespace Psc {
// std::exit std::terminate 的核心区别就是 是否需要生成core_dump 文件
// std::terminate() 到底做了什么(标准层面)
// 默认行为:调用 std::abort()
// abort() → 发送 SIGABRT
// 在 Linux/systemd 下:
// SIGABRT 通常生成 core
// 前提:
// ulimit -c ≠ 0
// LimitCORE 允许
// 未被 coredump 规则拦截
// 典型触发场景:
// 未捕获异常
// noexcept 函数抛异常
// 明确选择 Fail-Fast
// terminate 的职责:
// 定义 “此时必须终止” 的 语言语义
// 调用 terminate handler
// 允许用户替换策略(std::set_terminate
// std::set_terminate([]{
// log_fatal();
// std::abort();
// });
// std::exit() 到底做了什么(标准层面)
// C++ 标准规定,std::exit() 会:
// 调用 所有 std::atexit() 注册的函数(逆序)
// 刷新并关闭标准 I/O
// 结束进程
// TODO: 未被管理的线程的 线程安全问题
std::atomic_int stop_program = 0;
std::function<void(std::string)> g_fail_fast = [](std::string msg) {
std::cout << get_current_time_as_string() << " 默认快速失败触发!(不生成core_dump_文件) " << VAR_STR_1(msg) << " 系统错误码:" << get_error_message() << std::endl;
std::cout << LOG_POS << std::endl;
std::exit(75);
};
void fail_fast(std::string msg) {
g_fail_fast(std::move(msg));
}
void set_fail_fast(std::function<void(std::string)> ff) {
std::cout << "set_fail_fast 覆盖默认主动失败处理函数" << std::endl;
g_fail_fast = std::move(ff);
}
void fail_fast_core_dump(std::string msg) {
std::cout << get_current_time_as_string() << " 默认快速失败触发!(生成core_dump_文件) " << VAR_STR_1(msg) << " 系统错误码:" << get_error_message() << std::endl;
std::cout << LOG_POS << std::endl;
std::terminate();
}
}