123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #ifndef _AUTODMP_H_
- #define _AUTODMP_H_
- #include <string>
- #include <atomic>
- #include <csignal>
- #include <unistd.h>
- #include <sys/syscall.h>
- #include <execinfo.h>
- #include <sys/resource.h>
- #include <sys/ucontext.h>
- // 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<bool> initialized_{false};
- std::atomic<bool> 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_
|