Segmentation fault

本文详细介绍了Linux中Segmentation fault的原因,包括访问不存在的内存、系统保护内存、只读内存和栈溢出等。同时,讨论了何时进程会生成core dump,以及如何开启和控制core dump功能,包括修改`/etc/security/limits.conf`和`/proc/sys/kernel/core_pattern`。此外,还提到了使用gdb调试core文件的方法和dmesg命令的用途。文章还提到了相关信号如SIGSEGV和SIGBUS的区别,并给出了一些调试工具的使用,如`-g`参数、nm命令和ldd。
摘要由CSDN通过智能技术生成

Segmentation fault


#Linux Core Dump
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。
我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

  1. core dump 产生的原因:
    段错误是指访问的内存超出了系统给这个程序所设定的内存空间
    a.访问不存在的内存地址 (int *ptr = NULL;*ptr = 0;)
    b. 访问系统保护的内存地址 (int *ptr = (int *)0;*ptr = 100;)
    c.访问只读的内存地址
    d.栈溢出

2 当进程收到以下信号的时候会产生core dump

signal
SIGQUIT
SIGILL
SIGABRT
SIGSEGV
SIGTRAP

当然不仅限于上面的几种信号。这就是为什么我们使用 Ctrl+z 来挂起一个进程或者 Ctrl+C 结束一个进程均不会产生 core dump,因为前者会向进程发出 SIGTSTP 信号,该信号的默认操作为暂停进程(Stop Process);后者会向进程发出SIGINT 信号,该信号默认操作为终止进程(Terminate Process)。同样上面提到的 kill -9 命令会发出 SIGKILL 命令,该命令默认为终止进程。而如果我们使用 Ctrl+\ 来终止一个进程,会向进程发出 SIGQUIT 信号,默认是会产生 core dump 的。还有其它情景会产生 core dump, 如:程序调用 abort() 函数、访存错误、非法指令等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值