coredump是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下会产生一个叫做core的文件。
core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等
在类linux系统下,coredump文件本身主要的格式也是ELF格式,因此,我们可以通过readelf命令进行判断。
可以看到ELF文件头的Type字段的类型是:CORE (Core file)
可以通过简单的file命令进行快速判断
ulimit -c: 返回0表不生成 大于0的数表生成文件大小限制 unlimited表文件大小不受限制
设置core dump文件大小
ulimit -c 0
ulimit -c 1024
ulimit -c unlimited
当前设置的ulimit只对当前会话有效,若想系统均有效,则需要进行如下设置:
a> /etc/profile中加入以下一行,这将允许生成coredump文件
ulimit-c unlimited
b> 在rc.local中加入以下一行,这将使程序崩溃时生成的coredump文件位于/data/coredump/目录下:
echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern
注意rc.local在不同的环境,存储的目录可能不同,su下可能在/etc/rc.d/rc.local
用 Core Dump 表示当程序异常终止或崩溃时,将进程此时的内存中的内容拷贝到磁盘文件中存储,以方便编程人员调试
下列出几种信号,它们在发生时会产生 core dump:
SIGQUIT
Core Quit from keyboard
SIGILL
Core Illegal Instruction
SIGABRT
Core Abort signal from abort
SIGSEGV
Core Invalid memory reference
SIGTRAP
Core Trace/breakpoint trap
当然不仅限于上面的几种信号。这就是为什么我们使用 Ctrl+z 来挂起一个进程或者 Ctrl+C 结束一个进程均不会产生 core dump,因为前者会向进程发出 SIGTSTP 信号,该信号的默认操作为暂停进程(Stop Process);后者会向进程发出SIGINT 信号,该信号默认操作为终止进程(Terminate Process)。同样 kill -9 命令会发出 SIGKILL 命令,该命令默认为终止进程。
而如果我们使用 Ctrl+\ 来终止一个进程,会向进程发出 SIGQUIT 信号,默认是会产生 core dump 的。还有其它情景会产生 core dump, 如:程序调用 abort() 函数、访存错误、非法指令等等。
默认生成的 core 文件保存在可执行文件所在的目录下,文件名就为 core。
通过修改 /proc/sys/kernel/core_uses_pid 文件可以让生成 core 文件名是否自动加上 pid 号。
生成的 core 文件名将会变成 core.pid,其中 pid 表示该进程的 PID。
[root@atms:/proc/sys/kernel]# echo 1 > core_uses_pid
还可以通过修改 /proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置以及文件名格式。
例如可以用 echo “/tmp/corefile-%e-%p-%t” > /proc/sys/kernel/core_pattern 设置生成的 core 文件保存在 “/tmp/corefile” 目录下,文件名格式为 “core-命令名-pid-时间戳”
%% 单个%字符
%p dump进程的进程ID
%u dump进程的用户ID
%g dump进程的组ID
%s 导致core dump的信号
%t core dump 的时间
%h 主机名
%e 程序文件名
[root@atms:/proc/sys/kernel]# ls core*
core_pattern core_pipe_limit core_uses_pid
[root@atms:/proc/sys/kernel]# echo “/tmp/corefile-%e-%p-%t” > /proc/sys/kernel/core_pattern
使用 gdb 调试 Core 文件
bt命令,显示函数调用堆栈,显然func函数被main函数调用
#本次启动之后的日志 dmesg
dmesg日志只记录本次启动之后的信息,但较messages更详细。内核或应用软件bug发生的情况下大多有如下形式的calltrace(栈回溯信息)记录,可用于问题定位:
注:
#dmesg命令 查看的是/var/log/dmesg文件
查看系统常规日志–messages日志
#查看messages日志
more /var/log/messages
#查看最后10条系统常规日志
tail -10 /var/log/messages
内核及系统日志有系统服务rsyslog统一管理,根据其主配置文件
/etc/rsyslog.conf 中的设置决定将内核消息及各种系统程序消息记录到什么位置.
/var/log/access-log 记录HTTP/WEB的信息
/var/log/dmesg 内核启动时的日志,开机时在屏幕显示,该命令查看本地系统启动时的硬件和内核缓冲信息,用dmesg命令查看
/var/log/boot.log 记录系统启动的软件日志信息
/var/log/dmesg :主要记录系统在开机时内核检测过程所产生的信息; 通过执行dmesg命令查看.
/var/log/wtmp or /var/log/faillog: 这两个文件可以记录正确登陆系统者的账户信息(wtmp),与错误登陆时所使用的账户信息; last命令就是读取wtmp文件来获取的.
/var/log/btmp:记录错误登陆日志,这个文件是二进制的,不能使用cat命令查看,而要使用lastb命令查看.
/var/run/utmp:记录当前一登陆用户的信息,不能使用cat命令查看,而要使用w,who,users命令来查询.
/var/log/lastlog:记录了系统上面所有账户最近一次登陆系统时的相关信息 lastlog命令就是读取这个文件里的记录来显示的.
/var/log/secure:系统安全日志,记录用户远程登录,认证过程中的事件信息,只要涉及到需要用户名和密码的操作,那么当登陆系统是(不论正确错误),都会记录到这里.
/var/log/messages:这个文件非常重要,几乎系统发生的错误信息,或者重要信息都会被记录在这里.系统公共常规日志,记录内核消息,包括启动,IO/网络/程序错误日志
/var/log/cron:主要记录关于crontab计划任务的相关信息,比如,系统计划任务的错误配置,计划任务的修改等. 查看系统计划任务日志tail --f /var/log/cron 使用关键字过滤计划任务日志grep “alidata” /var/log/cron
/var/log/malilog or /var/log/mail/*:记录着邮件的往来信息,默认是postfix邮件服务器的一些信息.