文章目录
- core dump
core dump
进程退出时有三种情况正常退出,退出结果不对,异常退出
低7位表示收到信号退出,次低八位代表进程正常退出它的退出码!在第八位有一个core dump标志位,这个标志位表示进程收到信号做的动作,是core还是term,一般默认为终止或者暂停
用man 7 signal查看
Term 和 Core表示收到信号的动作是终止进程。
测试core dump
#include<cstdlib>
#include<unistd.h>
#include<signal.h>
#include<string>
#include <sys/wait.h>
#include<sys/types.h>
using namespace std;
int main()
{
int id = fork();
if(id == 0)
{
//child
int cnt = 500;
while(cnt)
{
cout << "i am a child process, pid: " << getpid() << "cnt: " << cnt << endl;
sleep(1);
cnt--;
}
exit(0);
}
// father
int status = 0;
pid_t rid = waitpid(id, &status, 0);
if(rid == id)
{
cout << "child quit info, rid: " << rid << " exit code: " <<
((status>>8)&0xFF) << " exit signal: " << (status&0x7F) <<
" core dump: " << ((status>>7)&1) << endl; // ? & (0000 0000 ... 0001)
}
}
将退出码收到信号和core dump打印出来查看,然后通过kill向进程发送信号
发送2号信号core dump是0没问题,因为它的默认动作是term,但是发送8号信号core dump还是0,8号信号默认动作是core dump,出现这样的现象是因为我这是云服务器,云服务器对于core dump功能是关闭的,虚拟机对于core dump的功能是开启的!
设置core dump
那么如何将core dump开启,可以通过ulimit -a 查看系统配置
其中有一个
查看core文件大小 ulimit -c
core 文件大小是0,这个就是core dump功能的文件,他类型是blocks,若是要将其开启,只需要对这个文件设置大小即可。
ulimit -c +想要设置的大小
这样就把core dump功能打开了,一般普通用户是设置不了的,没有权限这样就要sudo提权再设置!若是要关闭core dump只需要将这个core 文件大小设置为0就可以了或者重启xshell
把core dump打开并运行程序向进程发送8号信号查看结果
可以发现此时core dump标志位变为了1
并且在当前目录形成了一个很大的core.进程pid文件这个文件中存放的是进程出异常的信息。
打开文件core dump功能,一旦进程出异常了,操作系统会将进程在内存中的运行信息给我dump(转储)到进程的当前目录中(磁盘),形成core。pid文件,这样的功能为:核心转储(core dump)
那么为什么要进行核心转储?
这是因为可以方便事后调试!因为程序出错,这样的错误是运行时错误,一个程序崩掉了,就可能想知道是怎么错的或者是什么时候出错的,或者在哪一行出错的,就可以通过core
dump查看这些错误信息
,core dump提供在运行时出错了的信息给我们查看,之后再让对应程序以可调试的方式运行,然后再启动gdb调试,直接输入core 文件就可以知道程序的出错原因!
把文件导入会直接定位到出错原因!
core文件中存储了程序出错的原因!core dump功能方便事后调试。这个功能可以用在以后程序出错,实在是找不到bug的时候,可以使用core 方式它可以直接复现问题之后直接定位到出错行,先运行再core-file,这样是事后调试等到程序崩溃了再调试!
那么为什么云服务器要关闭core dump呢?
因为每次core
dump都i形成一个core.pid文件这个文件夹并且还是很大的,若是一个服务器中出现大量程序错误,然后形成大量的core文件,这会给磁盘带来消耗并且可能危及到操作系统,所有服务器一般是将这个功能关闭的,若是用户在有需要的时候可以将其开启!