[Linux] 什么是 段错误(吐核)?
段错误
我们在Linux
环境下编程中,有时执行编译好的文件时会出现段错误(吐核),这是经常出现的一个错误。
它是什么意思呢? 这个错误过程中都有哪些文件? 与VS
中IDE
直接报错有何不同?我们将通过本篇进行探讨。
- 查阅相关文档发现,产生段错误的原因主要有:
- 解引用空指针
- 访问不可访问的内存空间(如内核空间)
- 访问不存在的内存地址
- 试图写一个只读内存空间(如代码段)
- 栈溢出(函数递归调用)
- 使用未初始化的指针(定义时没有初始化或者已经回收)
比如我们在程序中
对一个空指针进行解引用
进行演示:
这里就出现了如开头第一张图中所示的段错误(吐核)
吐核:吐出了一个“核心转储文件”(coredump
文件)
程序确认出现错误时的“临终遗言” 写入核心转储文件,也是使用gdb
调试器最常用到的场景
- 那么如何查看吐出的 核心转储文件?
我们尝试ls -a
查看全部文件 (包含默认隐藏的文件)发现也并没有相关的新文件产生。
- 其实操作系统有限制,默认不允许随意吐核,在一个工程中
coredump
文件有可能会特别大,多次吐核过于占存,这样随意吐核会影响机器性能,一定要慎用。
文件什么样?
我们通过指令查看与程序相关的属性,其中会包含核心转储文件信息:
ulimit -a
第一条core file
就是coredump
—— 核心转储文件,size
为0
表示不允许吐核,更改一下文件大小就可以顺利产出吐核文件了。
● 通过指令更改为大小为无限制
ulimit -c unlimited
我们再执行./main
,再次吐核。
之后 ls
就会出现core.3616
文件,数字后缀不同机器会不一样,这个不用在意。这个就是核心转储文件,我们成功通过操作查看到了。
仔细查看文件详情,发现文件确实占存很大:
那么我们通过vim
进入文件内部,看看它究竟是什么样子的:
果然如我们所料看不太懂,不知所云,这时候就借助我们老搭档gdb
调试器的力量,输入指令:
gdb 可执行文件名 + 核心转储文件名
核心转储文件通过不同的可执行文件可能吐出不同的核,所以要带上可执行文件名,告诉操作系统这个核心转储文件是哪个可执行文件吐出的。
在这个程序中我们就输入gdb main core.3616
,回车后就可以定位程序错误原因了:
错误原因
- 红色方框中显示了在
main.c
文件中的Add函数
中第6
行对应的*p = 100;
这句代码有问题,导致程序异常终止,因为空指针不能解引用。 - 蓝色方框是一个比较重要的概念,11号信号,它是段错误(
Segmentation fault
)的典型图腾。
调用情况
那么这错误的第6行代码到底是怎么执行的?
可以通过bt
指令查看函数调用栈:
所以是因为main
函数调用Add
函数再调用Add2
函数,就在第6行出现了错误。这就是它的调用情况。
小结
其实段错误就是:
硬件设备MMU
发现访问了一个非法的虚拟地址,通知操作系统内核给进程发送11号信号,进程收到了一个11号信号,导致进程异常终止。
[Linux] 什么是 段错误(吐核)?相关推荐
- linux段错误吐核怎么办,CentOS命令
网络配置 # 重启网络管理器 $ service network restart # 查看IP地址 $ ip addr # 修改IP配置 $ cd /etc/sysconfig/network-scr ...
- 如何解决 “ 段错误(吐核) ” ???
一.段错误的形式: 在编程中以下几类做法容易导致段错误,基本上是错误地使用指针引起的. 1)访问系统数据区,尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址. 2)内存越界(数组越界,变量 ...
- linux程序运行段错误,Linux下段错误调试技巧
更新于2019.04.17 我们写的程序, 尤其是C/C++程序有时候会段错误, 而且往往发生在部署环境而非调试环境, 对问题定位带来很大困难. 这时一般有两种方法来解决问题, 一种是生成core d ...
- 转Linux环境下段错误的产生原因及调试方法小结
Linux环境下段错误的产生原因及调试方法小结 转载于:https://www.cnblogs.com/objectDetect/p/7575659.html
- Linux下的段错误产生的原因及调试方法-转
分类: Linux--Ubuntu入门级 重学C/C++2011-10-19 22:13 332人阅读 评论(0) 收藏 举报 因为你调用了glibc的fputs 检查你传进去的char* +++++ ...
- linux程序运行段错误,Linux下的段错误产生的原因及调试方法
Linux下的段错误产生的原因及调试方法 简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一般来 说,段错误就是指访问的内存超出 ...
- Linux下的段错误调试方法
转自http://wenku.baidu.com/view/7416d23710661ed9ad51f33f.html 执行socket文件时,出现段错误 (core dumped) 产生段错误就是访 ...
- linux执行命令段错误,Linux运行fortran程序 出现段错误(segmentation fault)
在Windows下编译运行fortran程序时,没有问题 ,运行时出现堆栈错误,只要在CVF里修改一下扩大内存设置: MAIN MENU: Project ===> Setting ===> ...
- Linux环境下段错误的产生原因及调试方法小结
From:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基 ...
最新文章
- 清华大学开源迁移学习算法库:基于PyTorch实现,支持轻松调用已有算法
- 2012体感发展加速,微软再添新对手
- java启动子线程过多导致卡死_java线程基础巩固---多Product多Consumer之间的通讯导致出现程序假死的原因分析...
- 【收藏】华为路由器交换机配置命令大全
- Git常见错误(附解决办法)
- 十问十答 GPL 许可证
- Docker 搭建pxc集群 + haproxy + keepalived 高可用(二)
- Codeforces Round #756 (Div. 3)
- 图像基础知识 —— Opencv图像处理
- 微信公众平台客户端调试工具
- find和xargs的使用
- C++ Liberary websit
- CWMP\TR069协议学习随笔1——入门基础知识及环境搭建
- RFC 5627 SIP中文翻译
- 旋翼无人机及摄影测量基础
- 买了淘宝TeamViewer盗版账号才知道安全没保障,大家别再上当了
- cu3er 3D幻灯切换效果 div被遮住的解决方法
- 基于华为WAC双机VRRP热备份下旁挂三层组网隧道转发模式解决方案
- windows中无法删除文件,报无法删除****,找不到指定文件,请确定指定的路径及文件名是否正确的解决
- Xilinx Virtex-5 FPGA CLB资源学习笔记
热门文章
- 美国学生在使用计算机小短文,前段时间,一篇北大毕业美国留学生的短文!
- 两个上课打瞌睡的男孩
- 优达(Udacity)smartcab
- 《计算机网络--自顶向下方法》第二章--应用层
- java E201_01_05鬼谷算题
- 寒假总结和新学期计划
- mac 备份android 手机,Mac怎么备份_Windows怎么备份_iOS怎么备份_安卓怎么备份-太平洋IT百科手机版...
- 部分iphone机型无法实现css的animation动画效果(无效, 失效)
- SPOJ Query on a tree 树链剖分 边修改
- 自动售货机html代码,自动售货机系统源代码.doc