实现Linux C++进程意外退出时信号处理与堆栈打印
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void handler(int sig) {
void *array[10];
size_t size;
// 获取所有活动调用的数组
size = backtrace(array, 10);
// 打印出所有栈帧的地址到stderr
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}
int main() {
// 安装信号处理器
signal(SIGSEGV, handler); // 11是Segmentation Fault信号
signal(SIGABRT, handler); // 6是Abort信号
// 以下是故意造成段错误的代码
int *foo = (int*)-1; // 非法指针
printf("%d\n", *foo); // 尝试解引用该指针导致段错误
return 0;
}
这段代码首先包含了必要的头文件,然后定义了一个信号处理函数handler
,它使用backtrace
和backtrace_symbols_fd
函数来获取堆栈信息并打印出来。在main
函数中,我们通过signal
函数注册了两个信号处理器,分别处理SIGSEGV
和SIGABRT
信号,然后故意制造了一个段错误来测试信号处理函数的功能。
评论已关闭