什么是core?
在linux中,程序运行时出现异常解体,操作系统会将程序过后的内存状态、调用堆栈等信息保留在core文件中。这种行为就是core dump(外围转储)。core文件中个别会保留寄存器信息(包含程序指针、栈指针等)、内存治理信息、CPU和操作系统状态和以及函数调用堆栈等信息。所以,core文件对于开发人员是十分重要的,很多时候咱们都须要依赖对core文件的剖析联合日志来定位和解决解体的问题。
core dump相干设置
在linux中,core dump的一些相干设置办法:
- 查问:ulimit -c,查问后果为0则示意敞开core dump性能,零碎默认是敞开的。
- 敞开:ulimit -c 0。
- 关上:ulimit -c unlimited,不限度core文件大小,也能够限度指定大小,单位是blocks(个别为kB),如ulimit -c 100示意限度core文件大小为100k。
- 批改core文件名生成规定:通过执行命令echo 1 > /proc/sys/kernel/core_uses_pid,能够将生成core文件的文件名改为core.pid。默认状况下,core dump生成的文件名为core,文件生成在程序当前目录下。且新的core会笼罩已存在的core。
- 批改生成门路和文件名:通过批改/proc/sys/kernel/core_pattern能够管制core文件保留地位和文件格式。例如,通过命令echo “/tmp/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern将core文件保留在/tmp/corefile/目录下,文件名的格局为core-命令名-pid-工夫戳.
-
core_pattern的命名参数如下:
%e dump的命令名 %p dump的过程PID %t dump工夫戳(由1970年1月1日起计的秒数) %s 导致本次core dump的信号 %c 转储文件的大小下限 %g dump的过程的理论组ID %u dump过程的理论用户ID %h 主机名
产生core文件的必备条件
- 环境变量的设置:通过后面介绍的ulimit –c等环境变量的设置关上core文件的生成限度。
- 程序编译选项的设置:要产生 core 文件,编译器必须反对把以后过程的镜像以某种格局 dump 到一个文件中,常见的比方 gcc/g++ 的 -g 选项。
- 解体时的非凡信号:Linux内核会依据过程退出时的信号的类型来决定是否要产生 core 文件。例如SIGSEGV、SIGABRT等信号会产生core,而SIGALRM、SIGPIPE等信号不会产生core。
GDB调试core文件
当程序core dump之后,应用命令gdb program core来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。而后执行bt(backtrace)命令查看函数的调用堆栈,定位解体产生的地位。其余gdb调试技巧在此不赘述。
core文件的毛病
- 因为 core 文件是对过后过程地址空间的镜像,所以 core 文件大小个别都会比拟大,这样很占用磁盘空间,而且如果要将文件从服务器上下载到本地剖析也会比拟耗时。
- 对于缓冲区溢出导致的 coredump ,过程的调用堆栈曾经被笼罩毁坏了, core 文件显示的堆栈信息往往谬误。
- 程序因SIGALRM、SIGPIPE等信号解体,则不会产生 core 文件。