Created attachment 1107 [details] 实际结果因类似空指针这种,libsigsegv可正常捕获并处理段错误 [问题描述]: Anolis23环境,libsigsegv软件包,安装 libsigsegv 的段错误处理程序sigsegv_install_handler后,栈溢出导致的段错误没有被成功捕捉而是程序直接退出了 [环境信息]: 机器类型:ECS [内核信息]: # uname -r -r 5.10.134-15.an23.x86_64 [操作系统信息]: # cat /etc/os-release cat /etc/os-release NAME="Anolis OS" VERSION="23" ID="anolis" VERSION_ID="23" PLATFORM_ID="platform:an23" PRETTY_NAME="Anolis OS 23" ANSI_COLOR="0;31" HOME_URL="https://openanolis.cn/" BUG_REPORT_URL="https://bugzilla.openanolis.cn/" [重现步骤]: 1、环境上安装libsigsegv、libsigsegv-devel 2、创建捕获栈溢出段错误场景的C文件: # cat bak_stack_over.c #include <stdio.h> #include <stdlib.h> #include <sigsegv.h> /* 栈溢出处理函数 */ static int overflow_handler(void *fault_address, int serious) { printf("Stack overflow detected at address: %p\\n", fault_address); exit(2); return 0; //上句已返回,不会执行 } int main(void) { /* 安装 libsigsegv 的栈溢出处理程序 */ sigsegv_install_handler(overflow_handler); printf("Causing stack overflow...\\n"); char large_array[1024 * 1024 * 10]; large_array[0] = 1; /* 如果栈溢出处理程序可以正常恢复,以下行将不会执行 */ printf("This line should not be executed.\\n"); return 0; } 3、编译gcc -o bak_stack_over bak_stack_over.c -lsigsegv 4、执行strace ./bak_stack_over 预期结果: 出现类似 Stack overflow detected at address: XXX的信息后程序退出 实际结果:收到SIGSEGV 信号后直接段错误程序直接对出 # strace ./bak_stack_over execve("./bak_stack_over", ["./bak_stack_over"], 0x7ffe772df910 /* 41 vars */) = 0 brk(NULL) = 0x1721000 arch_prctl(0x3001 /* ARCH_??? */, 0x7ffee7dc1e50) = -1 EINVAL (Invalid argument) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc9068ad000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=14143, ...}, AT_EMPTY_PATH) = 0 mmap(NULL, 14143, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc9068a9000 close(3) = 0 openat(AT_FDCWD, "/lib64/libsigsegv.so.2", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832 newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=20016, ...}, AT_EMPTY_PATH) = 0 mmap(NULL, 20552, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc9068a3000 mmap(0x7fc9068a4000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7fc9068a4000 mmap(0x7fc9068a6000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fc9068a6000 mmap(0x7fc9068a7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fc9068a7000 close(3) = 0 openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\3206\2\0\0\0\0\0"..., 832) = 832 pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784 newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=2203056, ...}, AT_EMPTY_PATH) = 0 pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784 mmap(NULL, 1932592, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc9066cb000 mmap(0x7fc9066ed000, 1396736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7fc9066ed000 mmap(0x7fc906842000, 339968, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x177000) = 0x7fc906842000 mmap(0x7fc906895000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c9000) = 0x7fc906895000 mmap(0x7fc90689b000, 32048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc90689b000 close(3) = 0 mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc9066c8000 arch_prctl(ARCH_SET_FS, 0x7fc9066c8740) = 0 set_tid_address(0x7fc9066c8a10) = 47920 set_robust_list(0x7fc9066c8a20, 24) = 0 rseq(0x7fc9066c9060, 0x20, 0, 0x53053053) = 0 mprotect(0x7fc906895000, 16384, PROT_READ) = 0 mprotect(0x7fc9068a7000, 4096, PROT_READ) = 0 mprotect(0x403000, 4096, PROT_READ) = 0 mprotect(0x7fc9068df000, 8192, PROT_READ) = 0 prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 munmap(0x7fc9068a9000, 14143) = 0 --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7ffee73c1e98} --- +++ killed by SIGSEGV (core dumped) +++ Segmentation fault (core dumped) [问题发生概率]:必现