核心目标是保留崩溃瞬间的完整上下文,包括调用栈、寄存器状态、内存布局和触发地址;需配置core文件生成、利用dmesg/catchsegv快速捕获、启用AddressSanitizer提前报错,并用GDB复现分析。

Linux 系统中捕获段错误(Segmentation Fault)的异常现场,核心目标是**保留崩溃瞬间的完整上下文**——包括调用栈、寄存器状态、内存布局和触发地址。这不是事后“猜”,而是主动配置系统与工具,在崩溃发生时自动抓取关键证据。
开启并配置 core 文件生成
core 文件是操作系统在进程收到 SIGSEGV 时自动生成的内存快照,是分析崩溃最直接、最完整的现场资料。
- 检查当前限制:
ulimit -c,若输出为0,说明禁止生成 - 临时启用:
ulimit -c unlimited(当前终端有效) - 永久生效:向
/etc/security/limits.conf追加两行* soft core unlimited* hard core unlimited - 指定存储位置和命名规则(推荐):
echo "/var/core/core-%e-%p-%t" | sudo tee /proc/sys/kernel/core_pattern
这样所有 core 文件会集中存到/var/core/,文件名含程序名、PID 和时间戳,避免混淆 - 注意:编译程序时必须加
-g,否则 core 文件无法关联源码行号
利用系统级工具快速获取内核视角信息
即使没有 core 文件或 GDB 不可用,内核日志里也藏着关键线索。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
dmesg | tail -20查看最近的内核日志,段错误会记录类似:[12345.678901] your_app[1234]: segfault at 0000000000000000 ip 000055a1b1d2a13e sp 00007ffc3a4b8d20 error 4 in your_app[55a1b1d2a000+1000]
其中at是非法访问地址(如0表示空指针),error 4表示用户态读操作访问了无效地址 -
catchsegv ./your_program可在不改代码前提下,自动捕获段错误并打印简明堆栈,适合快速初筛
编译时注入运行时检测能力
让程序在崩溃前就主动报错,把“段错误”变成可读性强、定位精准的诊断信息。
- 使用 AddressSanitizer(ASan):
gcc -fsanitize=address -g your.c -o your
运行时报错时会明确指出是 heap-buffer-overflow、use-after-free 还是 stack-use-after-return,并附带源码行号和内存访问详情 - 对 C++ 项目,还可搭配
-fsanitize=undefined检测未定义行为(如整数溢出、移位越界) - ASan 开销可控(通常慢 2 倍左右),适合开发和测试环境常态化启用
用 GDB 直接复现并冻结现场
对于能稳定复现的问题,GDB 是最直观的“实时探针”。
- 启动调试:
gdb ./your_program,然后输入run(可带参数) - 崩溃后立即执行:
bt—— 显示完整调用栈,定位到出错源码行info registers—— 查看rip(指令指针)、rdi/rax(可能的非法指针)等寄存器值x/10xg $rsp—— 查看栈顶附近内存,辅助判断栈是否被破坏 - 若需观察变量或内存内容:
p ptr、x/s ptr、print *(int*)0x0(谨慎使用)

















