什么是core dump文件
当程序发生崩溃或异常终止时,内核会把程序当前的内存映射到core文件里,方便查找崩溃错误
如何产生core dump文件
查看当前是否已开启core dump功能, 返回0则默认关闭
ulimit -c
临时开启core dump功能
ulimit -c unlimited
永久开启core dump功能
修改 /etc/security/limits.conf 增加一行
* 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常用命令
继续运行直到下一个断点
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(使用篇)