NoiLinux中编写cpp程序出现段错误的解决方案分析

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进行学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值