gdb调试以及段错误吐核

段错误

我们在Linux环境下编程中,有时执行编译好的文件时会出现段错误(吐核),这是经常出现的一个错误。


它是什么意思呢? 这个错误过程中都有哪些文件? 与VS中IDE直接报错有何不同?我们将通过本篇进行探讨。

查阅相关文档发现,产生段错误的原因主要有:

1,解引用空指针

2,访问不可访问的内存空间(如内核空间)

3,访问不存在的内存地址

4,试图写一个只读内存空间(如代码段)

5,栈溢出(函数递归调用)

6,使用未初始化的指针(定义时没有初始化或者已经回收)

比如我们在程序中 对一个栈溢出(函数递归调用)进行解引用 进行演示:

————————————————


这里就出现了如开头第一张图中所示的段错误(吐核)

吐核:吐出了一个“核心转储文件”(coredump文件)

  程序确认出现错误时的“临终遗言” 写入核心转储文件,也是使用gdb调试器最常用到的场景

那么如何查看吐出的 核心转储文件?

  我们尝试ls -a查看全部文件 (包含默认隐藏的文件)发现也并没有相关的新文件产生。

其实操作系统有限制,默认不允许随意吐核,在一个工程中coredump文件有可能会特别大,多次吐核过于占存,这样随意吐核会影响机器性能,一定要慎用。

文件什么样?

我们通过指令查看与程序相关的属性,其中会包含核心转储文件信息:

ulimit -a


第一条core file就是coredump—— 核心转储文件,size为0表示不允许吐核,更改一下文件大小就可以顺利产出吐核文件了。

● 通过指令更改为大小为无限制

ulimit -c unlimited

我们再执行./kylin-about,再次吐核。

之后 ls 就会出现core.21319的文件,数字后缀不同机器会不一样,这个不用在意。这个就是核心转储文件,我们成功通过操作查看到了。


那么我们通过vim进入文件内部,看看它究竟是什么样子的:


果然如我们所料看不太懂,不知所云,这时候就借助我们老搭档gdb调试器的力量,输入指令:

gdb 可执行文件名 + 核心转储文件名

核心转储文件通过不同的可执行文件可能吐出不同的核,所以要带上可执行文件名,告诉操作系统这个核心转储文件是哪个可执行文件吐出的。

在这个程序中我们就输入gdb ./kylin-about  core.21319,回车后就可以定位程序错误原因了:

错误原因


红线中显示调用库文件libc.so.6中出错,但是具体是什么,尚未看出。

红线上一行显示11号信号,它是段错误(Segmentation fault)的典型图腾。

调用情况

那么这错误的代码到底是怎么执行的?

  可以通过bt指令查看函数调用栈:


可以看出最后在main.c中调用main(),main()调用create_canvas(),在第506行出现问题。

再来看看第506行的代码:

while((tmpchar1=fgetc(file))!=EOF)

这是一个循环,可以判断出应该是栈溢出(函数递归调用),即出现了死循环(循环无法正常退出)。

小结

其实段错误就是:

硬件设备MMU发现访问了一个非法的虚拟地址,通知操作系统内核给进程发送11号信号,进程收到了一个11号信号,导致进程异常终止。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 我是日记星球361号星宝宝,我正在参加日记星球星宝宝第十五期21天蜕变之旅,这是我的第六十六篇原创日记。 计划春季...
    遇见更好的我自己阅读 249评论 0 0
  • 他 那样叫人心生怜爱 他 总是让我温暖惬意 我不能没有他的陪伴 可是他 却要渐渐离我远去 找寻属于他的苍穹 与他爱...
    香奈儿妈阅读 120评论 0 0
  • 我们总是在别人的感情里清清楚楚,做个智者;到自己这里就是糊里糊涂,如同白痴;所谓的‘当局者迷旁观者清’,也不...
    小混混儿阅读 445评论 0 0