赞
踩
在Linux中,使用gdb对core文件进行调试是一种有效的定位程序崩溃的方法。当程序出错而异常中断时,OS会把程序工作的当前状态存储成一个core文件。
通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。
cat /proc/sys/kernel/core_pattern
/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e %P %I %h
# 配置永久生效 [root@localhost ~]# vi /etc/security/limits.conf dmdba soft core unlimited dmdba hard core unlimited # 查看是否生效 [root@localhost ~]# su - dmdba [dmdba@localhost ~]$ ulimit -c # 修改文件生成路径和命名格式,生成到BUG进程的所在目录 [root@localhost ~]# echo "./core-%e-%p-%s" > /proc/sys/kernel/core_pattern [root@localhost ~]# cat /proc/sys/kernel/core_pattern ./core-%e-%p-%s # 查看是否生效 [root@localhost ~]# sysctl kernel.core_pattern kernel.core_pattern = ./core-%e-%p-%s # 修改/etc/sysctl.conf 参数 [root@localhost ~]# vi /etc/sysctl.conf kernel.core_pattern=./core-%e-%p-%s kernel.core_uses_pid=1 # 使修改生效 [root@localhost ~]# sysctl -p
# 通过强杀一个进程产生一个coredump文件
[dmdba@localhost ~]$ ps -ef|grep dms
dmdba 1618 1 0 16:46 ? 00:00:09 /home/dmdba/dmdbms/bin/dmserver path=/data/DAMENG/dm.ini -noconsole
dmdba 3585 3330 0 17:07 pts/0 00:00:00 grep --color=auto dms
[dmdba@localhost ~]$ kill -11 1618
[dmdba@localhost ~]$ cd /home/dmdba/dmdbms/bin/
# 会在dmserver的目录下生成一个core文件
[dmdba@localhost bin]$ ll core*
-rw------- 1 dmdba dinstall 2808848384 Aug 29 17:08 core-dmserver-1618-8
文件的结果会被Linux的一个abrt进程吞掉了。abrtd 是一个守护进程监控的应用程序崩溃。
[root@localhost ~]# systemctl status abrtd.service
[root@localhost ~]# systemctl stop abrtd.service
[root@localhost ~]# systemctl disable abrtd.service
[dmdba@localhost bin]$ pwd
/home/dmdba/dmdbms/bin
[dmdba@localhost bin]$ ll core*
-rw------- 1 dmdba dinstall 2808848384 Aug 29 17:08 core-dmserver-1618-8
-rw------- 1 dmdba dinstall 2811404288 Aug 29 12:27 core-dmserver-9442-8
-rw------- 1 dmdba dinstall 2900819968 Aug 30 11:17 core-dm_sql_thd-1645-8
[dmdba@localhost bin]$ gdb dmserver core-dm_sql_thd-1645-8
可以看出中断由 dmserver 引起,并且和 0x0000000001b72677 对应的线程有关。
(gdb) info thr
对应线程号LWP 4225
[dmdba@localhost bin]$ ./dmrdc SFILE=./core-dm_sql_thd-1645-8 DFILE=./core-dm_sql_thd-1645-8-tmp
[dmdba@localhost bin]$ more core-dm_sql_thd-1645-8-tmp
!#%&*^$@[4225]:select A.UDepartment,c.TroubleTimes,A.IsRunEq,
TO_CHAR(DATE_SUB(TO_DATE(TroubleTimes,'yyyymm' ),INTERVAL '1' MONTH), 'yyyymm') AS Lastmonth,
TO_CHAR(DATE_SUB(TO_DATE(TroubleTimes,'yyyymm' ),INTERVAL '1' YEAR), 'yyyymm') AS LastYear
from EMM_SNNumberhead a
left join (select equipmentID,
to_char(TroubleTime,'yyyymm') as TroubleTimes
from EPM_MAINTENANCEORDERHEADT)c
on a.oid=c.equipmentID;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。