如何创造/处理一个segmentation fault (core dumped)

segmentation fault (core dumped)是一个曾经让我非常头疼的报错,当然它还有一种中文形式,段错误(核心已转移)

这种错误可能会在各种程序中出现,每次我都用软件名加报错信息去搜索,对于一些常见软件,我能够找到一些解决方案,于是我能按照它们提供的方式进行解决。而对于一些比较小众的软件,就几乎无解了。

直到我学习「c和指针」,我自己创造出了一个段错误,我终于不再害怕这个报错(当然也仅限于不在害怕而已)。

下面这行代码,我觉得和printf("hello world!\n")一样重要。"hello world!"让你开始入门编程,而理解下面的代码则让你深入编程。

#include <stdio.h>
int
main()
{
    int *a ;
    *a = 12;
}

我们可以将其复制到到一个error.c中,然后编译运行

gcc -o error error.c
./error
[2]    110633 segmentation fault (core dumped) ./error

在代码中,我们创建一个叫做a的指针变量,后面赋值语句则是把12存储在a所指向的内存地址,从逻辑上看好像没啥问题。其背后的问题,且听我慢慢道来。

a是一个指针变量,它和普通变量一样,它也有特定的内存地址,在那个内存递上也存放着值,该值是一个地址。对于一个普通变量而言,如果它们在声明的时候没有初始化,那么它们会有一个默认值,比如说int i;在我的机器上的结果是0。那么对于一个指针变量而言,如果没有在声明的时候没有初始化,它的值是什么呢?我用下面的代码测试了下

#include <stdio.h>

int
main(){
    int i;
    int *a;

    printf("i:%d\n",i);
    printf("a:%p\n",a);
}

在三次运行过程中,i的值始终为0,而a的值则是0x7ffee20e7dc0, 0x7ffc1d202d10,0x7fff50972560.这些都对应着内存上的一个地址。对*a进行赋值的过程,也就是对它对应的内存地址进行赋值,这就带来了一个问题。如果这些内存是合法能被我们操作的,那么这个操作将会顺利进行,不会出现报错,但是可能会出现一些你完全想象不到的问题。但如果内存是受到保护或者对应地址不存在(大部分情况),那么在Linux系统上就会跳出错误。

现在我们知道了,段错误(core dumped)是程序访问/使用它不能使用的内存地址所导致的,那么今后面对程序出现这个报错时,我们应该做呢?

  1. 使用软件名 + 段错误对应的英文(core dumped)进行检索, 比如说 "STAR core dumped", 相对而言,用英文检索的资料会比较
  2. 检查自己的服务器内存是否充足,对于一些比对软件或者组装软件而言,它们比较占用内存,因此内存不够就会出现错误
  3. 检查自己的输入是否合法,这可能是程序没有合理的错误捕捉机制,导致遇到错误格式的输入依旧运行了代码,结果中间指针没有正确初始化,最终出错
  4. 更新软件:新的软件可能会修复之前代码错误
  5. 换个软件:有些软件的版本可能就停留在它发表文章那一天,那么这个工具可能也不太可
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 1,977评论 0 12
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,202评论 0 6
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 2,566评论 0 73
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,318评论 0 35
  • 未涂色的画:这小兔子咋这么有灵性呢,真是可爱呢。无畏勇敢地冲向未知的远方。 完成的画:今天我要美美哒,明天也要美美...
    辰尼阅读 587评论 0 2