segment fault本质
要谈segment fault,必须要谈指针。
指针的本质是什么?只不过是一种带*的数据类型,其特色有:
1、宽度
2、声明
3、赋值
4、++与--
5、+与-
6、求差值
7、比较
当声明int *ptr = 0x0之后,ptr1就是一个指针变量了,
可以对ptr1做++,--,+,-等各种操作,
然而不能访问ptr地址中的内容,因为访问的是非法内存地址0x0(内核空间地址?)。
当声明int *prt2 = 0x12345678之后,prt2就是一个指针变量了,
可以对ptr1做++,--,+,-等各种操作,
也可以访问ptr地址中的内容,因为访问的是合法内存地址0x12345678(用户空间地址)。

从Linux内核角度来看,segment fault发生有三种原因:
当应用程序访问一个虚拟地址时,正常情况下,你实际上是在访问处于某个VMA中的一个地址而已。如果你正常的访问,那么一切都如你所愿,MMU读入内核task_struct中记录的表格,然后,虚拟地址正确地转换到物理内存地址。但是,如果:
1. 如果内核标明这个VMA是只读的,但你偏偏往这个地址段中写,内核自然不能容忍应用程序犯这样的错误。
2. 你可能去访问虚拟地址空间中某个根本没有映射的hole. 刚学指针的 C 程序员总是以为自己无所不能,比如:
int *p = (int *)0x543;
*p = 5;
然后运行程序时,他肯定会很开心地收到段错误,然后为此郁闷一个下午。究其原因其实很简单: 0x543这个地址没有处于一个合法的VMA中,它可能处于一个根本没有和物理内存映射的虚拟空间的hole中. 对于教训新手 C 程序员来说,内核还是非常乐意的,因为新手C程序员离能够驾驭Linux内核的水准至少还差那么三五年时间。
3. 应用程序访问内核空间(0xc000 0000 --> 0xffff ffff),内核早早就说明那不是应用程序应该访问的地址范围。居然敢打内核的主意!这个应用程序一定活得非常不耐烦,是在找抽。
segment fault本质的更多相关文章
- 出现segment fault 错误的几种原因
segment fault 段异常各种原因www.MyException.Cn 发布于:2012-11-26 11:48:50 浏览:24次 0 segment fault 段错误各种原因一 造成se ...
- Segment fault及LINUX core dump详解 (zz)
C 程序在进行中发生segment fault(core dump)错误,通常与内存操作不当有关,主要有以下几种情况: (1)数组越界. (2)修改了只读内存. (3)scanf("%d&q ...
- Segment fault及LINUX core dump详解
源自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the work ...
- 利用linux信号机制调试段错误(Segment fault)
在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...
- GDB调试之core文件(如何定位到Segment fault)
core dump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中,叫core dump.(内部实现是:linux系统中内存越界会收到SI ...
- segment fault异常及常见定位手段
问题背景 最近boot中遇到个用户态程序的segment fault异常,除了一句"Segment fault"打印外无其他任何打印.该问题复现概率较低,定位起来比较棘手.我们的b ...
- gdbserver移植到DM368板子上的过程 以及segment fault problem
问题描述 我在PC机上安装了gdbserver,但是移植到板子上后却出现了问题.运行不了,显示错误:"segment fault". 决定重新在另一台虚拟机上gdbserver. ...
- “段错误(segment fault)”、“非法操作,该内存地址不能read/write” 非法指针解引用造成的错误。
小结: 1. “段错误(segment fault)”.“非法操作,该内存地址不能read/write”非法指针解引用造成的错误. <程序员的自我修养 : 链接.装载与库> Q 我写的程序 ...
- 【Z】段错误Segment Fault定位,即core dump文件与gdb定位
使用C++开发系统有时会出现段错误,即Segment Fault.此类错误程序直接崩溃,通常没有任何有用信息输出,很难定位bug,因而无从解决问题.今天我们介绍core dump文件,并使用gdb进行 ...
随机推荐
- 洛谷OJ P2846 LJJ的数学课
题目链接:传送门 题目大意:略 题目思路:线段树or树状数组 我们可以将区间值做一些调整.a*3+b*2+c=a+(a+b)+(a+b+c) 也就是利用前缀和建树.然后单点更新也就转换成了区间更新.修 ...
- docker 中安装 FastDFS 总结
如题,参考各资料后,安装FastDFS总结.基于已有docker镜像 https://hub.docker.com/r/luhuiguo/fastdfs/ docker pull luhuiguo/f ...
- Java散列和散列码的实现
转自:https://blog.csdn.net/al_assad/article/details/52989525 散列和散列码 ※正确的equals方法应该满足的的条件: ①自反性:x.equ ...
- 160706、Java HashMap工作原理及实现
1. 概述 从本文你可以学习到: 什么时候会使用HashMap?他有什么特点? 你知道HashMap的工作原理吗? 你知道get和put的原理吗?equals()和hashCode()的都有什么作用? ...
- 巨蟒python全栈开发-第8天 文件操作
一.文件操作 今日大纲: 1.文件操作->open() open 打开 f=open(文件路径,mode='模式',encoding='编码格式') #python最最底层操作的就是bytes ...
- SQL架构信息读取
--架构: select * from information_schema.SCHEMATA --表: select table_name from information_schema.table ...
- mysql 中事件
# 创建存储过程 /* delimiter // create procedure test() begin update test SET name = date_format(now(),'%Y- ...
- 微信支付 超时 mysql.event
$wtime 使用具体timestamp //rand 防推测 $wev = 'ev_gbuy_create_' . trim($winsert_id) . rand(100, 999); $sql ...
- java 日期的格式化 输入/输出
想要得到形如2018.07.09的格式化好的当天日期 创建Date对象,调用SimpleDateFormat对象的format方法: indexstr="logstash-"+ne ...
- Python 模块之Logging——常用handlers的使用
一.StreamHandler 流handler——包含在logging模块中的三个handler之一. 能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就 ...