Segmentation fault 利用 core.xxx文件帮助你debug

在没有get到本文介绍的技能之前的时候,以前遇到程序发生了 Segmentation fault 时,也是一筹莫展,看到伴随程序崩溃而生成的 core.xxxx 文件时(有时会生成,有时不会生成,留着下面介绍),也觉得该文件毫无用处,主要是太菜了不知道该怎么使用这样的文件。

先写一段明眼人都能看出来的含有大bug的一段代码:

#include <iostream>

int func(int *ptr)
{
	int ret = *ptr;
	return ret;
}

int main(int argc, char** argv)
{
	int *p = nullptr;
	return func(p);
}

使用下面命令,编译程序并没有报错,为了调试程序时,需要加 -g 参数;

g++ -Wall -std=c++11 -g -o test test.cpp

 执行 test 可执行程序,发生 Segmentation fault,但是并没有生产 core.xxxx 这样的文件

这是因为:大多数操作系统默认情况下是不允许产生 core.xxxx 这样的文件的,因为这样的文件通常都是比较大的,怕占用了太多的磁盘空间;若是一个比较大的可执行程序,在加上多线程或多进程并行执行,如果程序崩溃,产生的 core.xxxx 文件肯定不止一个,而且单个 core.xxxx 文件也会非常大,这样会占用太多的空间,所以默认情况下是不允许产生的。

执行 ulimit -c 命令,会输出 0,表示不允许产生 core.xxxx 文件

为了调试程序的话,可以允许它暂时生成,执行 ulimit -c unlimited 设置为不受限制,再次执行 ulimit -c 则会输出 unlimited

现在执行可执行程序 test,则会输出 core.xxxx文件

 

 现在就可以利用这个  core.xxxx 文件来帮助我们调试程序,快速定位问题了;

使用 gdb 时,需要紧跟 两个参数,一个可执行程序,一个为 core.xxxx 文件

这样就可以快速帮我们定位到程序崩溃的代码行了,正是由于对空指针解引用访问了内核地址空间,所以程序必然会崩溃。

以上只是一个简单示例代码,在实际工作中遇到类似的问题也可以借助于core.xxxx文件来快速定位问题。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值