目录
core dump(核心转储)
引入
介绍
core dump标志
引入
介绍
应用 -- gdb调试
注意点
ulimit命令
-a
-c
示例 -- core file大小问题
core dump(核心转储)
引入
- 我们可以看到,不同的signal对应不同的编号和action:
- 其中action主要分为term和core
- term就是终止的意思
- 而core是什么呢?
介绍
- 在进程由于某些错误(如段错误)而终止时,操作系统可能会生成core转储文件
- (其实就是,如果被发送带有core属性的信号,就会产生core文件)
- 这个文件包含了进程在崩溃时的内存映像,可以用于调试
- 该文件大小可以被设置
- 如果文件大小为0,即使应该发生核心转储,也不会生成core文件
core dump标志
引入
在之前介绍wait函数时,它有一个参数status,用于保存进程退出信息:
它用bit位存储信息,其中低8位存储被信号杀死时的信息:
第8位就是core dump标志:
介绍
如果杀死它的信号带有core dump属性,就会将第8位赋为1
而读取该bit位,就可以让os知道,到底要不要将该进程在内存中的核心数据转存到磁盘上
应用 -- gdb调试
void test2(){ int a=1; a/=0; }
代码运行结果:
会发现它对应的就是8号信号:
生成core文件后,使用gdb调试:
直接加载core文件,可以定位到发生异常的位置:
注意点
- 一般生产环境中,core dump是关闭的
- 因为如果出现问题,主机并不会直接关闭,而是重启服务
- 但一运行就挂,一运行就挂,会产生非常多的core文件,最终可能会导致磁盘爆满
- 而虚拟机一般是默认开启的(因为它用于测试和开发)
ulimit命令
-a
可以查看有关各种系统资源的硬资源和软资源限制的信息
-c
可以查看或设置shell 会话的核心转储文件大小限制
当前是0:
设置为1024后:
示例 -- core file大小问题
其中3号信号会发生核心转储,所以使用3为例子:
当core file 大小为0时,发送3号信号,并没有生成core文件:
不为0时:
所以可以说明,文件大小会影响最终到底有没有生成core文件