linux下core文件设置与生成coredump文件

落花浮王杯 提交于 2019-12-21 23:27:00

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一、core文件设置
1、core文件的生成开关和大小限制
(1)使用ulimit -c 查看,若为0,则表示关闭了此功能,不会生成core
(2)ulimit -c filesize 限制core的大小 单位kbyte
ulimit -c unlimited 大小不受限制

2.core文件的名称和生成路径
若系统生成的core文件不带其它任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。

(1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid

(2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
    %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 添加命令名

3.用gdb查看core文件:
下面我们可以在发生运行时信号引起的错误时发生core dump了.
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->行.

二、使用GDB生成coredump文件
如果在测试过程中遇到某个进程的CPU利用率过高或者卡死而需要去调试该进程时,
可以利用gdb命令生成coredump文件,然后再去调试coredump文件来定位问题。

那么如何使用gdb生成coredump文件呢?其实步骤很简单:

1. 安装好gdb,然后使用命令 'gdb'。(假设需要调试的进程号为 21509)
2. 使用 ‘attach 21590’命令将gdb附加到进程21509上。
3. 使用‘gcore core_name’命令生成coredump文件core_name。
4. 使用‘detach’命令断开连接。
5.使用‘q’命令退出gdb。

此时,在当前目录下就会产生一个名为core_name的coredump文件。下面就可以利用gdb工具来对该coredump文件进行调试了。

三、GDB调试
gdb的调试步骤
1、启动gdb(gdb ./a.out)

2、设置输入参数
(gdb) set args 3

3、打印代码
(gdb)list line(行号)

4、设置断点
(gdb)b 46(行号)

5、运行程序
(gdb)run 

6、显示变量
(gdb)display i
(gdb)c (继续运行)

7、修改变量的值
(gdb) set result=9

8、退出gdb
(gdb) q

gdb常用命令
list  list[开始,结束]    列出文件的代码清单 l
print   print p   打印变量的内容  p
break  break[行号|函数名] 设置断点   b
continue continue[开始,结束] 继续运行   c
info  info pass  列出信息   i
next  next   下一行   n
setp  setp   进入函数   S
display  dispaly pass   显示参数  
file  file path  加载文件 
run  run args  运行程序   r

9、加载文件
启动gdb是没有选择程序名称
可以
(gdb)file test

10、参数默认参数值
(gdb)set args 3
(gdb)show args

11、打印变量名和表达式
(gdb) print var
(gdb) p 2+3
(gdb) p sum(3)
(gdb) p *io (打印结构体的各成员的值)
$9 = {value = 3, result = 6}
(gdb)p $9

12、设置断点
break 行号:程序停止在设定的行号之前
break 函数名称:在设定的函数之前
break 行号或者函数if条件:如果条件为真。则程序在到达指定行或者函数时停止
(gdb) b ex02-gdb-01.c:46
(gdb) b ex02-gdb-01.c:sum
(gdb) b 46 if i==2
(1)显示断点
(gdb) info b
(2)删除断点
(gdb) delete b 8 (断点编号)
(3)禁用断点
(gdb) disable b 9
(4)启动断点
(gdb) enable b 8
(5)清除断点
clean line
(gdb) clean 9

13、变量检查
(gdb)whatis *io
(gdb)ptype *io 

14、调用路径
backtrace 命令可以打印函数调用的路径、提供向前跟踪的功能
backtrace 打印一个顺序列表,函数从最近到最远的调用过程,包涵调用函数和其中参数,简写bt
在第46行设置断点后打印调用过程
(gdb) bt

15、info

16、多线程
1、先获取线程的id,然后转到改线程进行调试
info thread列出当前进程中的线程号,其中最前面为调试的id
用thread id 进入线程

17、disassemble
(gdb) disassemble sum 

18、help

参考:

(1)http://blog.csdn.net/sky_qing/article/details/8548989

(2)http://blog.chinaunix.net/uid-16979052-id-3431343.html

    

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!