1)coredump作用
coredump主要用于监测Linux系统中进程因为一些非法操作导致挂死,记录此时进程挂死的堆栈信息,各种函数接口调用关系,运行时的内存,内存管理信息,寄存器状态,将当前程序工作状态储存到一个core文件中,最后通过调试分析工具进行分析进程挂死原因(如gdb --core=corefile)
2)coredump文件存储位置
core文件默认存储在与可执行程序在同一级目录,文件名:core,通过cat /proc/sys/kernel/core_pattern 获取缺省保存文件名
可以通过手动修改存储位置以及存储名字,时使其可以同时监测多个进程挂死状态不被覆盖
/*通过以下方式配置可以使进程崩溃时生成指定core文件目录以及文件名字 */
echo “/data/coredump/core.%e.%p” >/proc/sys/kernel/core_pattern
%e:表示进程名字;%p:表示记录进程号
注:cat
/proc/sys/kernel/core_uses_pid = 1时,默认记录了进程号,使用%p与否都会生成进程号
readelf <file>可以查看文件类型
3)系统环境中如何让coredump从启动时就开启对进程的监控
a)
产生coredump的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump,需要进行修改和设置。
ulimit -c unlimited (可以产生coredump且不受大小限制,只要系统缓存大小能承受就能存储)
ulimit -c [size] (设置大小,以块为单位1 blocks = 512bit)
Linux系统加载应用程序第一个执行脚本处添加以下监测脚本则系统开启coredump监测功能
vi /etc/init.d/rcS
ulimit -c unlimited
echo “/data/coredump/core.%e.%p” >/proc/sys/kernel/core_pattern
4)系统无法生成core文件可能有哪些原因
如果出现以下情况,则不会生成核心文件
(a) 进程是 set-user-ID 并且当前用户不是程序文件的所有者,或者
(b) 进程是 set-group-ID 并且当前用户不是文件的组所有者,
(c) 用户在当前工作目录没有写权限,
(d) 文件已存在且用户无权写入,或
(e) 文件太大, 核心文件的权限(假设该文件不存在)通常是用户读取和用户写入,尽管 Mac OS X 只设置了用户读取。
5)系统产生core文件有哪些可能情况
a)
内存访问越界
<1>
由于使用错误的下标,导致数组访问越界。
<2>搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。
<3>使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界
b)
多线程程序使用了线程不安全的函数
c)多线程读写的数据未加锁保护 ;多线程公共数据访问及时加锁
d) 非法指针
<1>野指针
<2>随意进行指针转换
e)堆栈移除,在代码编写时避免在栈空间定义太大局部变量,防止栈溢出;动态开启空间及时释放避免对空间泄露
6)使用追踪工具进行coredump定位
gdb调试工具:(常用调试命令如调试工具篇)
gdb <core_file>
7)coredump参数格式
可以在core_pattern模板中使用变量还很多,见下面的列表:
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名