本文来源于调试卡住程序方法,本文仅针对进程卡住但该程序未退出的情况
在我们开发程序,对程序进行运行测试时,偶尔会遇见程序莫名其妙的就卡死了,这种情况具有偶然性现场不好保留,没有太固定复现方式,从日志中也基本无法分析出卡死的原因,所以对于这种情况有点像全身长满尖刺的刺猬一样让我们无从下手。
这个时候就需要使用gdb提供的工具gcore,这工具具有对正在运行的进程获取其内存地址信息、寄存器信息、堆栈信息(内存快照)即core文件;
简单介绍core文件
core文件按ELF格式组成,不过只有执行视图,没有链接视图,就是只有Program Headers,没有Section Heders。所以用readelf命令查看时只能看到Segments而看不到Sections。异常产生时,Linux将卡死进程的内存段的内容以Segment的形式保存到Core文件中。
(包括数据区,堆栈区,已分配的堆内容,以及卡死时的帧结构数据等),对于代码段(属性为RX,即只读可执行的段),Linux不保存其内容,只保存代码段的地址信息;其它如线程信息、寄存器信息等辅助信息则保存在类型为PT_NOTE的Segment段中。
gcore使用方式
sudo apt install gdb
gcore pid(进程号)
输入命令gcore + pid(进程号)
提示报错信息,如下图:
解决办法:
su
sudo passwd root
后操作。echo 0 > /proc/sys/kernel/yama/ptrace_scope
,即可使用命令gcore + pid(进程号)
获取core文件