Linux GCC下的“核心已转储”

自己偶尔写一段代码,本来就是新手,能实现个冒泡排序就高兴得不行了,好不容编译通过了,运行的时候出现了“核心已转储”。以前也没有仔细的去查过这个问题。从现在开始凡是出现过这个问题的代码我都贴上来,然后再修改。

其实“核心已转储”就是“段错误”:当时在用Qt的时候也遇到过段错误这类的错误,当时解决了后得出的原因是:定义了空指针。

CSDN里面有很多厉害的前辈,百度的时候也发现了很多人遇到过类似的问题,把前辈们给出的各种答案大致上总结一下,已备大家以后排错的时候用:

1)访问系统数据区,尤其是往 系统保护的内存地址写数据    最常见就是给一个指针以0地址 

2)内存越界(数组越界,变量类型不一致等

3) 访问到不属于你的内存区域

(上述3条也是来自与CSDN某网友的总结)

在来看看 智慧的网友们是怎么回答:

1:core dump ,通常是因为segment fault,一般是访问越界引起的。

(某网友说的是:段错误,符合第二条,访问越界引起的。还是没懂访问越界是嘛意思?)

2:回复1:内存申请过大,或者越访问都会出现这样的问题。这个翻译是不是更应该翻译为:内存泄露更好一点?

智慧的网友又提出来了内存泄露这样深奥的问题,对于我这个初学者来说,不是很明白,那一会百度,了解下内存泄露吧)

3:段错误 一般是非法访问内存造成的。

(这个好理解,大体上懂一点,不就是非法反问嘛,你真懂?好像是那么回事)

4:程序 出问题了,crash了,这些coredump文件保持了一些信息,供以后分析

(我也知道程序出问题了,没问题会这样么?不过对小白来说,任何一个专业名词都是有用的知识。什么事coredump?)

5:通常是指针、内存等错误,错误会存储到coredump文件,用gdb等工具可对coredump文件分析,定位错误发生的位置。

(貌似回到了coredump是什么了,就是保存错位的文件,类似于你犯错了,为什么犯错?给记录下来。大神还提到内存、指针错位。)

6:IT人都叫这个“出core了”。

一般都是程序有内存操作错误并产生SIGSEGV信号, 并在目录下生成名字叫做core的文件.
源码编译与链接时记得加入-g, 这样就可以出core后:gdb 程序名 core来调试出错原因了,一般使用:
bt命令




先了解下上述几个回答中所涉及到的几个基本专业名词吧:
内存泄露:动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
经常提到的系统崩溃就有这个原因在:内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃
越界访问:内存访问越界,使用的内存 超出了 向系统申请了一块内存,覆盖该空间之后的一段存储区域,导致系统异常。
e.g.

1:写越界
char szText[10];
memset(szText,0,30);//这时就明显越界了,因为在定义的时候只申请了10个空间的内存,此时清零时却用到了30个空间。
上述就是典型的越界访问,这也是写越界的一种形式。
2:读越界
读了不属于自己的内存,所以如果地址无效,则系统崩溃,如果地址有效,则数据有效。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值