NOIP信息学奥赛复赛中全员需要使用noilinux来编写程序,大佬们教我们用vim,然后vim编写程序时不能逐步调试,只能断言输出(可能是井底之蛙没发现),而且在出现段错误的时候,只会华丽丽的出来如下类似语句:
/bin/bash:行 1 :2863 段错误 ./mst
shell 已返回 139
请按ENTER 或其它命令继续
然后大家就各种抓狂,清醒的呢还知道一步步去断言输出看程序走到哪出现的段错误,不清醒的只能盲目肉眼查错加心慌意乱。
段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。
在C++程序中,段错误一般来说由以下几种情况产生(有不足留言指出):
1.数组开爆,数组下表越界。
2.指针指向了未知的内存空间。
3.爆栈,函数递归调用时空间消耗过多。
4.除数为零。
……
好了下面来说说出现段错误的一种解决办法:使用gdb。使用步骤是:
1.将.cpp文件用编译软件编译生成可执行文件,如假设cpp文件名为mst.cpp,则用vim编译后会生成mst的可执行文件。
2.使用gdb命令调试程序
gdb ./mst
(mst为可执行文件名)
(此处我的mst.cpp文件时放在home下的stuTest文件加下,终端命令行指向了当前文件夹内。)
noilinux@ubuntu:~stuTest/$ gdb ./mst
GNU.gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2)7.7.1
Copyright (c)。。。。
。。。。。
Reading symbols from ./mst...(no debugging symbols found) ...done
3.进入gdb后输入run运行程序
(gdb) run
就会出现如下类似语句:
Starting program: /home/noilinux/stuTest/mst
Program received signal SIGSEGV, Segmentation fault.
0x0804868a in find (int) ( )
(gdb)
从输出看出,程序mst收到SIGSEGV信号,触发段错误,并提示地址0x0804868a、调用find函数报错。立即将段错误定位到find函数内部查错。
4.找到段错误产生的地点后,输入 quit 命令退出gdb:
(gdb) quit
A debugging session is active.
Inferior 1 [process 3046] will be killed.
Quit anyway? (y or n) y
以上便是我所理解的一种关于段错误的解决方法,更多关于段错误的解决方法,可以详见我用来学习参考的博客http://makaidong.com/liangzhao_jay/1/8452_11287162.html进行学习。