什么是core dump文件

当程序发生崩溃或异常终止时,内核会把程序当前的内存映射到core文件里,方便查找崩溃错误

如何产生core dump文件

查看当前是否已开启core dump功能, 返回0则默认关闭

ulimit -c

临时开启core dump功能

ulimit -c unlimited

永久开启core dump功能


  • 修改 /etc/security/limits.conf 增加一行

    1. * soft core unlimited
  • 修改~/.bashrc

编译源文件的时候, 最好加入编译Debug版, 增加调试信息

gcc program.c -g

运行的是否出现coredump的话就会在软件目录下生成core文件

如何使用 core dump文件

使用GDB 工具查看core文件

gdb program core //program是可执行文件, core是core文件名

gdb 命令

where //查看在哪一行代码出错 info frame //查看栈帧 p var_name //查看变量的值

core dump实验

尝试读0地址产生coredump

#include <stdio.h>
int func(int *p)
{
    int y = *p;
    return y;
}

int main()
{
    int *p = NULL;
    return func(p);
}

运行后产生 core文件

gdb coredump core

[alex@543c6ee9439e 03_coredump]$ ls
core.5259  coredump  coredump.c
[alex@543c6ee9439e 03_coredump]$ gdb coredump core.5259
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/alex/03_coredump/coredump...done.
[New LWP 5259]
Core was generated by `./coredump'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000004004d9 in func (p=0x0) at coredump.c:4
4           int y = *p;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.6.x86_64
(gdb) where
#0  0x00000000004004d9 in func (p=0x0) at coredump.c:4
#1  0x00000000004004ff in main () at coredump.c:10
(gdb) info frame
Stack level 0, frame at 0x7ffc53b80520:
 rip = 0x4004d9 in func (coredump.c:4); saved rip 0x4004ff
 called by frame at 0x7ffc53b80540
 source language c.
 Arglist at 0x7ffc53b80510, args: p=0x0
 Locals at 0x7ffc53b80510, Previous frame's sp is 0x7ffc53b80520
 Saved registers:
  rbp at 0x7ffc53b80510, rip at 0x7ffc53b80518
(gdb) p p
$1 = (int *) 0x0
(gdb)

参考资料: Linux Core Dump | linux下core dump【总结】| 详解coredump


GDB调试

GDB中文手册完美版.pdf

gdb常用命令

继续运行直到下一个断点

continue(c)

单步运行,遇到函数会进入

step(s)

单步运行,遇到函数不会进入

next(n)

运行程序, 知道当前函数完成返回

finish

跳出循环体

until(u)

查看当前调用栈的所有信息

bt

查看栈帧

info frame

查看当前函数中所有局部变量和值

info locals

查看函数形参

info args

查看源代码

list linenum

查看寄存器值

info registers

为表达式(变量)expr设置一个观察点, 表达式(变量)值有变化则停住程序

watch expr

当表达式(变量)expr被读时, 则停住程序

rwatch expr

当表达式(变量)的值被读或被写时,则停住程序

awatch expr

查看所有的观察点

info wathpoints

查看所有断点

info break

清除停止点, 可以使用delete, clear, disable, enable命令
清除所有停止点

clear

清除某些停止点

clear filename:line_number clear line_number clear filename:function clear function

delete, disable. enable使用类似

delect 1 //删除断点号为1 的停止点

条件断点

break function:line_numeber expression break line_numeber condition

修改断点的条件

condition 断点号 expression

清除断点的条件

condition 断点号

查看变量

p var_name

查看地址内容

p *array@len

查看数组内容

p array

修改变量的值

p var_name=1

参考资料 : Linux嵌入式GDB调试环境搭建 | gdb调试coredump(使用篇)