什么是core dump? (down = 当)
core的意思是:内存,dump的意思是:扔出来、堆出来。
开发和使用Unix程序时,有时程序莫名其妙的down掉了,却没有任何的提示(有时候会提示core dumped)。
这时候可以查看一下有没有形如:core 的文件生成,这个文件便是操作系统把程序down掉时的内存的内容扔出来生成的,它可以做为调试程序的参考。
core dump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中,叫core dump。
如何使用core文件?
gdb -c core文件路径 [应用程序的路径]
进去后输入where回车,就可以显示程序在哪一行dowm掉的,在哪个函数中down掉的。
为什么没有core文件生成呢?
有时候程序down掉了,但是core文件却没有生成。
首先,就是要知道错误发生的地方。而Linux系统可以产生core文件,配合gdb就可以解决这个问题。
core文件的生成跟你当前系统的环境设置有关系,可以用下面的语句设置一下, 然后再运行程序便成生成core文件了。
第一步:让系统在信号中断造成的错误时产生core文件:
ulimit -c unlimited // 设置core大小为无限
ulimit unlimited //设置文件大小为无限
第二步:编译原来的程序:
gcc -o xxx xxx.c -g
(-g选项的作用是在可执行文件中加入源码信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,而是在调试时必须保证gdb能找到源文件。)
第三步:运行编译后的的程序:
./xxx(或者 .xxx)
运行后,然后 ls 发现多出来了core文件。
core文件生成的位置一般与运行程序的路径相同,文件名一般为 core。
第四步:用gdb查看core文件:
gdb xxx core
第五步:输入bt,就会出现错误的位置。如下图:
#0就是错误的具体位置。具体错误可以从#3到#0等等来找。
这里的错误是:fseek第一个参数为0x0,也就是说,文件指针为NULL。再看代码,发现原来文件指针没有被释放掉,所以在之后的访问同样文件时,发生了错误。
以上就是 core dumped调试的方法。