关于使用core文件进行故障定位分析

关于使用core文件进行故障定位分析

一.概述

1.简介

core是unix系统的内核。当程序出现内存越界的时候,操作系统会中止进程,并将当前内存状态倒出到core文件中,以便进一步分析。
linux系统下执行代码,不能正常运行,程序会core,或者直接离开,不会core。bug和操作系统或硬件的保护机制都会导致程序异常终止,操作系统会kill掉这些进程并产生core文件。通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,它记录了程序挂掉时详细的状态描述,程序员可以通过core文件来找出问题所在。

2.core dump

开发和使用 Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped)。这时候可以查看有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考。
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。

3.参数详解

%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 添加程序名

二.core文件的操作

1.查看core文件配置

cat /proc/sys/kernel/core_pattern
在这里插入图片描述

2.修改配置参数

修改core文件大小限制: vi /etc/security/limits.conf。添加以下内容:

dmdba soft core unlimited
dmdba hard core unlimited

切换dmdba用户,查看效果。

在这里插入图片描述

修改文件生成路径和命名格式,生成core文件到BUG进程的所在目录。运行以下命令,并查看是否成功。

echo “./core-%e-%p-%s” > /proc/sys/kernel/core_pattern

cat /proc/sys/kernel/core_pattern

在这里插入图片描述

修改/etc/sysctl.conf 参数

修改sysctl.conf文件:vi /etc/sysctl.conf,添加以下内容,并保存修改。

kernel.core_pattern=./core-%e-%p-%s

kernel.core_uses_pid=1

在这里插入图片描述

三.验证core文件生成

测试通过杀死一个进程产生一个coredump文件,以下步骤将dmserver服务杀死,并查看是否生成core文件。

查找dmserver服务进程号:ps -ef | grep dms

kill -11 进程号

cd到bin目录下查看core文件是否生成。

在这里插入图片描述

四.core文件分析

1.gdb打开core文件

运行命令:gdb dmserver core文件名

在这里插入图片描述

在这里插入图片描述

根据core文件内容,发现中断是由于dmserver引起,与线程号为 0x0000000001bc0487 的线程有关。

2.获取导致core的线程号

通过gdb命令info thr获取对应线程号

在这里插入图片描述

五. gdb常用命令

调试命令 (缩写) 作用
(gdb) break (b) 在源代码指定的某一行设置断点,其中xxx用于指定具体打断点位置
(gdb) run (r) 执行被调试的程序,其会自动在第一个断点处暂停执行。
(gdb) continue (c) 当程序在某一断点处停止后,用该指令可以继续执行,直至遇到断点或者程序结束。
(gdb) next (n) 令程序一行代码一行代码的执行。
(gdb) step(s) 如果有调用函数,进入调用的函数内部;否则,和 next 命令的功能一样。
(gdb) until (u)
(gdb) until (u) location 当你厌倦了在一个循环体内单步跟踪时,单纯使用 until 命令,可以运行程序直到退出循环体。
until n 命令中,n 为某一行代码的行号,该命令会使程序运行至第 n 行代码处停止。
(gdb) print (p) 打印指定变量的值,其中 xxx 指的就是某一变量名。
(gdb) list (l) 显示源程序代码的内容,包括各行代码所在的行号。
(gdb) finish(fi) 结束当前正在执行的函数,并在跳出函数后暂停程序的执行。
(gdb) return(return) 结束当前调用函数并返回指定值,到上一层函数调用处停止程序执行。
(gdb) jump(j) 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。
(gdb) quit (q) 终止调试。
(gdb) Backtrace(bt) 查看堆栈。
(gdb) info threads 显示当前可调试的所有线程
(gdb) thread ID 切换当前调试的线程为指定ID的线程
(gdb) attach process-id 在gdb状态下,开始调试一个正在运行的进程
(gdb) thread apply all command 所有线程执行command

参考资料:https://eco.dameng.com

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值