#ifndef _AUTODMP_H_ #define _AUTODMP_H_ #include #include #include #include #include #include #include #include // Linux崩溃信息结构体 struct CrashInfo { std::string timestamp; std::string processName; pid_t processId; pid_t threadId; std::string buildInfo; int signalNumber; std::string signalName; void* faultAddress; std::string backtrace; std::string signalDescription; }; // Linux崩溃配置选项 struct CrashConfig { bool enableCoreDump = true; // 是否生成core dump bool enableConsoleOutput = true; // 是否输出到控制台 bool enableLogFile = true; // 是否生成日志文件 bool enableBacktrace = true; // 是否生成调用栈 std::string crashDirectory = "./crashes"; // 崩溃文件目录 size_t maxCrashFiles = 10; // 最大保留崩溃文件数 size_t maxBacktraceDepth = 128; // 最大调用栈深度 bool enableSymbols = true; // 是否启用符号解析 bool enableDetailedInfo = true; // 是否启用详细信息 bool asyncSafeOnly = true; // 是否只使用异步安全函数 }; class AutoDmp { public: explicit AutoDmp(const CrashConfig& config = CrashConfig{}); ~AutoDmp(); // 禁止拷贝和赋值 AutoDmp(const AutoDmp&) = delete; AutoDmp& operator=(const AutoDmp&) = delete; // 手动触发崩溃处理(用于测试) bool generateTestCrash() const; // 获取配置 const CrashConfig& getConfig() const { return config_; } // 更新配置 void updateConfig(const CrashConfig& newConfig); // 检查是否已初始化 bool isInitialized() const { return initialized_.load(); } // 获取支持的信号列表 static const int* getSupportedSignals(); static size_t getSupportedSignalCount(); private: CrashConfig config_; std::atomic initialized_{false}; std::atomic crashInProgress_{false}; // 信号处理相关 static void signalHandler(int sig, siginfo_t* info, void* context); struct sigaction oldActions_[8]; // 保存原始信号处理 static const int handledSignals_[]; static const size_t handledSignalCount_; // 核心功能函数 static std::string getBacktrace(void* context, size_t maxDepth = 128); static bool setupCoreDump(); static std::string getSignalName(int sig); static std::string getSignalDescription(int sig, siginfo_t* info); // 辅助函数 - 异步安全 static void safeWriteToFd(int fd, const char* msg); static void safeWriteNumber(int fd, long number); static void safeWritePointer(int fd, void* ptr); // 辅助函数 - 非异步安全(仅在安全上下文使用) static std::string getCurrentTimestamp(); static std::string getProcessName(); static bool createDirectory(const std::string& path); static void cleanupOldFiles(const std::string& directory, size_t maxFiles); static void writeCrashLog(const CrashInfo& crashInfo, const std::string& filePath); static void outputDetailedInfo(const CrashInfo& crashInfo); // 初始化和清理 bool initializeHandlers(); void cleanupHandlers(); // 获取单例配置(用于静态处理函数) static const CrashConfig* getInstanceConfig(); static AutoDmp* instance_; }; // 便利宏:用于快速部署崩溃检测 #define ENABLE_CRASH_HANDLER() \ do { \ static AutoDmp crashHandler; \ (void)crashHandler; \ } while(0) #define ENABLE_CRASH_HANDLER_WITH_CONFIG(config) \ do { \ static AutoDmp crashHandler(config); \ (void)crashHandler; \ } while(0) // 调试宏:输出调试信息 #ifndef NDEBUG #define CRASH_DEBUG(msg) \ do { \ write(STDERR_FILENO, "[CRASH_DEBUG] ", 15); \ write(STDERR_FILENO, msg, strlen(msg)); \ write(STDERR_FILENO, "\n", 1); \ } while(0) #else #define CRASH_DEBUG(msg) do {} while(0) #endif #endif // _AUTODMP_H_