corefile介绍与gdb调试

时间:2024-04-03 16:53:50

一、什么是coredump

应用程序由于某些异常或者bug而被强制退出时,Linux系统会在当前目录或指定目录下生成一个core文件,供使用者调试定位程序异常出现的位置。core文件包含了程序运行时内存、寄存器状态、函数调用堆栈等调试信息。

二、core file的路径查看与设置

1、可通过如下命令查看core file的生成路径:

    cat /proc/sys/kernel/core_pattern

2、core file文件开关设置及名称设置:

    1)应判断系统是否在程序down掉之后生成core file,通过ulimit  -a可查看当前系统资源的一些限制信息,如图:

corefile介绍与gdb调试

这里core file size 大小设置为0 ,是不会在程序down掉后生成core文件的,可通过如下方式修改:

ulimit -c unlimited        #设置允许当前生成没有大小限制的core file

ulimit -c 1024                 #设置限制当前生成的core file大小为1024,这里单位为blocks,即为512 bytes

如欲关闭core file 生成,可如下设置:

ulimit -c 0

:如果生成的core file超过所设置的大小,将会被裁剪,生成不完整的core,在用gdb工具对此core调试的时候,将会提示错误。

    2)设置core file 的生成路径及命名格式。这里可通过如下命令,将自定义路径写入/proc/sys/kernel/core_pattern,从而实现路径设置。

echo "/data/corefile/core.%e.%p" > /proc/sys/kernel/core_pattern

此时,生成的core文件名为core.命令名.进程ID

相应的参数如下:

  %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 添加命令名

:若 /proc/sys/kernel/core_uses_pid 为1,即使core_pattern中没有设置%p,也会在生成的core文件名中添加进程ID。core_uses_pid其值为1或0亦可通过echo命令设置。

    3)上述的设置只作用于当前会话,重新登录后将失效,欲将上述设置永久生效,可通过如下设置:

vim /etc/security/limits.conf

corefile介绍与gdb调试

将上图标注的地方改为

corefile介绍与gdb调试

上述配置对所有用户有效,若需指定某用户或用户组,可如下设置:

corefile介绍与gdb调试

:上述配置需重新登录后生效,且经笔者试验,ubuntu 下由于自身bug,通配符 *  只对所有非root用户生效,欲对root生效,需手动将用户名设置为‘ root '。

三、gdb调试core file

以下为笔者编写的测试程序

corefile介绍与gdb调试

 对程序文件编译时需带-g 选项生成调试信息

corefile介绍与gdb调试

上述操作因传入的除数为0,造成程序异常终止,通过gdb调试可定位错误位置

corefile介绍与gdb调试

通过常用的gdb命令,可进一步对程序调试

l(list) ,          显示源代码,并且可以看到对应的行号;

b(break)x       x是行号,表示在对应的行号位置设置断点;

p(print)x         x是变量名,表示打印变量x的值

r(run)              表示继续执行到断点的位置

n(next)           表示执行下一 步

c(continue)    表示继续执行

q(quit)             表示退出gdb

bt n/-n           打印栈顶上n层/栈底下n层信息(此处n为正整数)

f(frame) n      查看某一层信息(n为层数)

info frame     会打出更为详尽的当前层的信息

info args        打印出当前函数的参数名及其值

info locals     打印出当前函数中所有局部变量及其值

info catch      打印出当前的函数中的异常处理信息

up  n               向上移n层   (无n,表向上移1层)

down    n       向下移n层(无n,表向下移1层