如何解决段错误

       程序运行时崩溃应该是经常遇到的事情,本篇文中就来讲解一下在Linux下如何解决程序崩溃,也就是发生了段错误之后找到程序具体出错的地方。

如果程序通过了编译,但是在使用命令 ./  a.out 运行时程序崩溃了,即显示  段错误(core dumped)

       其实系统会在程序崩溃的那一刹那将整个内核的信息记录在一个文件里边,(ls 并不会看到这个文件)
使用命令 ulimit -a 打开ulimit这个文件 发现这个文件大小缺省为0 文件根本就装不进去
那么就需要我们手动将这个文件的大小改大一点。

       使用 命令 ulimit  -c 10240  (10240的位置可以是任意一个比较大的数字)然后再利用 ./ 执行一次。
当再次使用 ls 查看会发现这个 core.3288  文件就存在了 ----(3288表示产生这个文件的进程的 ID)

可以使用命令 file core.3288 ,将core.3288这个文件的具体信息给显示出来,命令最后会显示这个core文件是通过哪个文件产生的(假如是a.out)

PS:file命令是用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程

接下来来调试分析问题到底出现在哪
使用命令   gdb 产生该core文件的文件名 core文件文件名    比如说  gdb a.out core.11277   然后回车
这个时候就会直接告诉我们问题出在哪个函数哪一行。

需要说明一下的是当前已经进入了调试模式,按 q 退出调试模式,然后就可以vim 我们的源文件根据错误信息修改我们的代码了。

注意:调段错误,编译的时候一定要加入-g选项,要不然在最后显示错误的时候只会显示错的地址,而不会显示错误的具体信息

下边就以一个极其简单的例子来具体显示一下解决段错误的整个过程
使用命令 vim  test.c  打开test.c这个源文件,按 i 进行编辑,输入如下程序
很明显这个程序是有问题的,在FunTest函数中,对NULL进行了解引用,这势必会导致程序崩溃,接下来就来通过这个简单的问题代码来帮助理解怎么解决断错误。
使用:wq 退出 test.c 这个文件回到命令模式,利用命令 gcc -g test.c  编译test.c,顺利通过编译。
使用命令 ls 查看一下,发现多了一个a.out 可执行文件。
然后再使用命令 ./a.out 执行,这个时候问题就来了
 
使用命令 ulimit -a 
重新运行一下然后再次使用 ls 命令查看,多了一个 core文件
利用命令 file core.3288查看一下这个文件的具体信息
然后使用命令 gdb a.out core.3288
最后 按 q 退出调试模式,然后修改我们的代码就OK了。

总结:
解决段错误主要就是如下几个步骤
step1:gcc -g 
step2:ulimit -c 10240
step3 : ./a.out
step4 : gdb a.out core文件

展开阅读全文

没有更多推荐了,返回首页