AutoDmp.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #ifndef _AUTODMP_H_
  2. #define _AUTODMP_H_
  3. #include <string>
  4. #include <atomic>
  5. #include <csignal>
  6. #include <unistd.h>
  7. #include <sys/syscall.h>
  8. #include <execinfo.h>
  9. #include <sys/resource.h>
  10. #include <sys/ucontext.h>
  11. // Linux崩溃信息结构体
  12. struct CrashInfo {
  13. std::string timestamp;
  14. std::string processName;
  15. pid_t processId;
  16. pid_t threadId;
  17. std::string buildInfo;
  18. int signalNumber;
  19. std::string signalName;
  20. void* faultAddress;
  21. std::string backtrace;
  22. std::string signalDescription;
  23. };
  24. // Linux崩溃配置选项
  25. struct CrashConfig {
  26. bool enableCoreDump = true; // 是否生成core dump
  27. bool enableConsoleOutput = true; // 是否输出到控制台
  28. bool enableLogFile = true; // 是否生成日志文件
  29. bool enableBacktrace = true; // 是否生成调用栈
  30. std::string crashDirectory = "./crashes"; // 崩溃文件目录
  31. size_t maxCrashFiles = 10; // 最大保留崩溃文件数
  32. size_t maxBacktraceDepth = 128; // 最大调用栈深度
  33. bool enableSymbols = true; // 是否启用符号解析
  34. bool enableDetailedInfo = true; // 是否启用详细信息
  35. bool asyncSafeOnly = true; // 是否只使用异步安全函数
  36. };
  37. class AutoDmp {
  38. public:
  39. explicit AutoDmp(const CrashConfig& config = CrashConfig{});
  40. ~AutoDmp();
  41. // 禁止拷贝和赋值
  42. AutoDmp(const AutoDmp&) = delete;
  43. AutoDmp& operator=(const AutoDmp&) = delete;
  44. // 手动触发崩溃处理(用于测试)
  45. bool generateTestCrash() const;
  46. // 获取配置
  47. const CrashConfig& getConfig() const { return config_; }
  48. // 更新配置
  49. void updateConfig(const CrashConfig& newConfig);
  50. // 检查是否已初始化
  51. bool isInitialized() const { return initialized_.load(); }
  52. // 获取支持的信号列表
  53. static const int* getSupportedSignals();
  54. static size_t getSupportedSignalCount();
  55. private:
  56. CrashConfig config_;
  57. std::atomic<bool> initialized_{false};
  58. std::atomic<bool> crashInProgress_{false};
  59. // 信号处理相关
  60. static void signalHandler(int sig, siginfo_t* info, void* context);
  61. struct sigaction oldActions_[8]; // 保存原始信号处理
  62. static const int handledSignals_[];
  63. static const size_t handledSignalCount_;
  64. // 核心功能函数
  65. static std::string getBacktrace(void* context, size_t maxDepth = 128);
  66. static bool setupCoreDump();
  67. static std::string getSignalName(int sig);
  68. static std::string getSignalDescription(int sig, siginfo_t* info);
  69. // 辅助函数 - 异步安全
  70. static void safeWriteToFd(int fd, const char* msg);
  71. static void safeWriteNumber(int fd, long number);
  72. static void safeWritePointer(int fd, void* ptr);
  73. // 辅助函数 - 非异步安全(仅在安全上下文使用)
  74. static std::string getCurrentTimestamp();
  75. static std::string getProcessName();
  76. static bool createDirectory(const std::string& path);
  77. static void cleanupOldFiles(const std::string& directory, size_t maxFiles);
  78. static void writeCrashLog(const CrashInfo& crashInfo, const std::string& filePath);
  79. static void outputDetailedInfo(const CrashInfo& crashInfo);
  80. // 初始化和清理
  81. bool initializeHandlers();
  82. void cleanupHandlers();
  83. // 获取单例配置(用于静态处理函数)
  84. static const CrashConfig* getInstanceConfig();
  85. static AutoDmp* instance_;
  86. };
  87. // 便利宏:用于快速部署崩溃检测
  88. #define ENABLE_CRASH_HANDLER() \
  89. do { \
  90. static AutoDmp crashHandler; \
  91. (void)crashHandler; \
  92. } while(0)
  93. #define ENABLE_CRASH_HANDLER_WITH_CONFIG(config) \
  94. do { \
  95. static AutoDmp crashHandler(config); \
  96. (void)crashHandler; \
  97. } while(0)
  98. // 调试宏:输出调试信息
  99. #ifndef NDEBUG
  100. #define CRASH_DEBUG(msg) \
  101. do { \
  102. write(STDERR_FILENO, "[CRASH_DEBUG] ", 15); \
  103. write(STDERR_FILENO, msg, strlen(msg)); \
  104. write(STDERR_FILENO, "\n", 1); \
  105. } while(0)
  106. #else
  107. #define CRASH_DEBUG(msg) do {} while(0)
  108. #endif
  109. #endif // _AUTODMP_H_