67 lines
2.2 KiB
C++
67 lines
2.2 KiB
C++
#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();
|
||
}
|
||
|
||
}
|