AutoDmp 是一个针对 Linux 系统优化的崩溃检测和转储生成工具,专门处理 Linux 信号和 core dump。
backtrace()
获取完整调用链#include \"AutoDmp.h\"
int main() {
// 一行代码启用Linux崩溃检测
ENABLE_CRASH_HANDLER();
// 你的程序代码...
return 0;
}
#include \"AutoDmp.h\"
int main() {
// Linux专用配置
CrashConfig config;
config.enableCoreDump = true; // 启用core dump
config.enableConsoleOutput = true; // 启用控制台输出
config.enableLogFile = true; // 启用详细日志
config.enableBacktrace = true; // 启用调用栈
config.crashDirectory = \"./crashes\"; // 崩溃文件目录
config.maxCrashFiles = 10; // 最大保留文件数
config.maxBacktraceDepth = 128; // 调用栈最大深度
config.enableDetailedInfo = true; // 启用详细信息
config.asyncSafeOnly = false; // 允许非异步安全操作
// 使用配置启用
ENABLE_CRASH_HANDLER_WITH_CONFIG(config);
// 你的程序代码...
return 0;
}
#include \"AutoDmp.h\"
int main() {
// 创建Linux崩溃处理器
CrashConfig config;
config.crashDirectory = \"./my_crashes\";
config.enableCoreDump = true;
AutoDmp crashHandler(config);
if (crashHandler.isInitialized()) {
std::cout << \"Linux崩溃检测已启用\" << std::endl;
// 查看支持的信号
const int* signals = AutoDmp::getSupportedSignals();
size_t count = AutoDmp::getSupportedSignalCount();
std::cout << \"监控 \" << count << \" 种Linux信号\" << std::endl;
}
// 你的程序代码...
return 0; // 析构时自动清理
}
core
或 core.PID
./crashes/crash_YYYYMMDD-HHMMSS.xxx.log
==================== LINUX CRASH REPORT ====================
Timestamp: 20231215-143022.456
Process: MyApp (PID: 1234)
Thread ID: 5678
Build Info: Dec 15 2023 14:29:30
Signal: SIGSEGV (11)
Signal Description: SIGSEGV - Segmentation fault (address not mapped)
Fault Address: 0x0
Detailed Backtrace:
#00: ./MyApp(_Z18testSegFaultv+0x12)[0x401234]
#01: ./MyApp(main+0x45)[0x401156]
#02: /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x7f8b2c0230b3]
#03: ./MyApp(_start+0x2e)[0x40105e]
============================================================
选项 | 类型 | 默认值 | 说明 |
---|---|---|---|
enableCoreDump |
bool | true | 是否生成 core dump |
enableConsoleOutput |
bool | true | 是否异步安全输出到 stderr |
enableLogFile |
bool | true | 是否生成详细日志文件 |
enableBacktrace |
bool | true | 是否生成调用栈 |
crashDirectory |
string | \"./crashes\" | 崩溃文件目录 |
maxCrashFiles |
size_t | 10 | 最大保留文件数 |
maxBacktraceDepth |
size_t | 128 | 调用栈最大深度 |
enableSymbols |
bool | true | 是否启用符号解析 |
enableDetailedInfo |
bool | true | 是否启用详细信息输出 |
asyncSafeOnly |
bool | true | 是否只使用异步安全函数 |
# GCC编译
g++ -std=c++11 -g -O0 -o test_crash test_crash.cpp AutoDmp.cpp -ldl -lpthread
# 确保能生成core dump
ulimit -c unlimited
# 运行测试
./test_crash
信号 | 数值 | 描述 | 常见原因 |
---|---|---|---|
SIGSEGV |
11 | 段错误 | 空指针、越界访问 |
SIGABRT |
6 | 异常终止 | abort()、断言失败 |
SIGFPE |
8 | 浮点异常 | 除零、溢出 |
SIGILL |
4 | 非法指令 | 损坏的代码、架构不匹配 |
SIGBUS |
7 | 总线错误 | 内存对齐、硬件错误 |
SIGSYS |
31 | 系统调用错误 | 无效系统调用 |
SIGPIPE |
13 | 管道错误 | 向关闭的管道写入 |
SIGQUIT |
3 | 退出信号 | Ctrl+\ |
# 1. 编译时包含调试信息
g++ -g -O0 -o myapp main.cpp AutoDmp.cpp -ldl
# 2. 运行程序(崩溃后会生成core文件)
./myapp
# 3. 使用GDB分析core dump
gdb ./myapp core
# 4. GDB常用命令
(gdb) bt # 查看调用栈
(gdb) bt full # 查看详细调用栈(含变量)
(gdb) info locals # 查看局部变量
(gdb) print var # 打印变量值
(gdb) list # 查看源代码
(gdb) frame 0 # 切换到栈帧0
(gdb) info threads # 查看所有线程
(gdb) thread 1 # 切换到线程1
# 查看内存映射
(gdb) info proc mappings
# 查看寄存器状态
(gdb) info registers
# 查看汇编代码
(gdb) disassemble
# 查看共享库
(gdb) info sharedlibrary
# 设置断点重现问题
(gdb) break main
(gdb) run
# 检查core dump设置
ulimit -c
# 启用core dump(无限制)
ulimit -c unlimited
# 设置core文件命名规则
echo 'core.%p.%t' | sudo tee /proc/sys/kernel/core_pattern
# 安装调试符号(Ubuntu/Debian)
sudo apt-get install libc6-dbg
# 设置符号路径
export DEBUGINFOD_URLS=\"https://debuginfod.ubuntu.com\"
info threads
查看所有线程状态libdl
- 动态链接libpthread
- 多线程支持libc
- 标准C库(backtrace支持)如有问题或建议,请联系项目维护团队。
本项目采用内部使用许可,仅供内部开发使用。