一、什么是coredump
应用程序由于某些异常或者bug而被强制退出时,Linux系统会在当前目录或指定目录下生成一个core文件,供使用者调试定位程序异常出现的位置。core文件包含了程序运行时内存、寄存器状态、函数调用堆栈等调试信息。
二、core file的路径查看与设置
1、可通过如下命令查看core file的生成路径:
cat /proc/sys/kernel/core_pattern
2、core file文件开关设置及名称设置:
1)应判断系统是否在程序down掉之后生成core file,通过ulimit -a可查看当前系统资源的一些限制信息,如图:
这里core file size 大小设置为0 ,是不会在程序down掉后生成core文件的,可通过如下方式修改:
ulimit -c unlimited #设置允许当前生成没有大小限制的core file
ulimit -c 1024 #设置限制当前生成的core file大小为1024,这里单位为blocks,即为512 bytes
如欲关闭core file 生成,可如下设置:
ulimit -c 0
注:如果生成的core file超过所设置的大小,将会被裁剪,生成不完整的core,在用gdb工具对此core调试的时候,将会提示错误。
2)设置core file 的生成路径及命名格式。这里可通过如下命令,将自定义路径写入/proc/sys/kernel/core_pattern,从而实现路径设置。
echo "/data/corefile/core.%e.%p" > /proc/sys/kernel/core_pattern
此时,生成的core文件名为core.命令名.进程ID
相应的参数如下:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
注:若 /proc/sys/kernel/core_uses_pid 为1,即使core_pattern中没有设置%p,也会在生成的core文件名中添加进程ID。core_uses_pid其值为1或0亦可通过echo命令设置。
3)上述的设置只作用于当前会话,重新登录后将失效,欲将上述设置永久生效,可通过如下设置:
vim /etc/security/limits.conf
将上图标注的地方改为
上述配置对所有用户有效,若需指定某用户或用户组,可如下设置:
注:上述配置需重新登录后生效,且经笔者试验,ubuntu 下由于自身bug,通配符 * 只对所有非root用户生效,欲对root生效,需手动将用户名设置为‘ root '。
三、gdb调试core file
以下为笔者编写的测试程序
对程序文件编译时需带-g 选项生成调试信息
上述操作因传入的除数为0,造成程序异常终止,通过gdb调试可定位错误位置
通过常用的gdb命令,可进一步对程序调试
l(list) , 显示源代码,并且可以看到对应的行号;
b(break)x x是行号,表示在对应的行号位置设置断点;
p(print)x x是变量名,表示打印变量x的值
r(run) 表示继续执行到断点的位置
n(next) 表示执行下一 步
c(continue) 表示继续执行
q(quit) 表示退出gdb
bt n/-n 打印栈顶上n层/栈底下n层信息(此处n为正整数)
f(frame) n 查看某一层信息(n为层数)
info frame 会打出更为详尽的当前层的信息
info args 打印出当前函数的参数名及其值
info locals 打印出当前函数中所有局部变量及其值
info catch 打印出当前的函数中的异常处理信息
up n 向上移n层 (无n,表向上移1层)
down n 向下移n层(无n,表向下移1层