什么是core?在Linux中,当程序在运行过程中异常崩溃时,操作系统会将程序的内存状态、调用栈等信息保存在core文件中。这种行为就是核心转储(coredump)。核心文件一般保存寄存器信息(包括程序指针、栈指针等)、内存管理信息、CPU和操作系统状态以及函数调用栈等信息。所以核心文件对于开发者来说是非常重要的,很多时候我们需要依靠核心文件结合日志的分析来定位和解决崩溃问题。coredump相关设置在Linux中,coredump的一些相关设置方法:查询:ulimit-c,如果查询结果为0,表示关闭coredump功能,系统默认关闭。关闭:ulimit-c0。开启:ulimit-cunlimited,不限制核心文件的大小,也可以限制指定的大小,单位是块(通常是kB),比如ulimit-c100表示核心文件大小限制为100k。修改core文件名生成规则:执行命令echo1>/proc/sys/kernel/core_uses_pid,将生成的core文件的文件名改为core.pid。默认情况下,coredump生成的文件名为core,生成在程序当前目录下。并且新核心将覆盖现有核心。修改生成路径和文件名:通过修改/proc/sys/kernel/core_pattern,可以控制core文件的保存位置和文件格式。例如使用命令echo"/tmp/corefile/core-%e-%p-%t">/proc/sys/kernel/core_pattern将core文件保存在/tmp/corefile/目录下,格式如下文件名的一部分是core-commandname-pid-timestamp。core_pattern的命名参数如下:%edump的命令名%pdump的进程PID%tdump时间戳(从1970年1月1日开始的秒数)%s导致这个secondarycoredump的信号%c上dump文件的大小限制%gdump进程的实际组ID%udump进程的实际用户ID%h主机名生成core文件的先决条件环境变量设置:通过上面介绍的ulimit-c等环境变量的设置开启了core文件的生成限制。程序编译选项的设置:要生成core文件,编译器必须支持将当前进程的映像转储到一定格式的文件中,比如gcc/g++的-g选项。崩溃时的特殊信号:Linux内核会根据进程退出时信号的类型来决定是否生成core文件。例如SIGSEGV、SIGABRT等信号会产生核,而SIGALRM、SIGPIPE等信号则不会产生核。GDB调试核心文件程序核心转储后,使用命令gdbprogramcore查看核心文件,其中program为可执行程序的名称,core为生成的核心文件的名称。然后执行bt(backtrace)命令查看函数的调用栈,定位到crash发生的位置。其他gdb调试技巧这里不再赘述。core文件的缺点因为core文件是当时进程地址空间的镜像,所以core文件的大小一般都比较大,占用磁盘空间大,会时-消耗从服务器下载文件到本地分析。对于缓冲区溢出导致的coredump,进程的调用栈已经被覆盖破坏,core文件显示的栈信息往往是错误的。如果由于SIGALRM、SIGPIPE等信号导致程序崩溃,则不会生成core文件。
