1. 开启core,采集程序奔溃的状态
$ulimit -c
如果是0表示没有开启,则需要开启
$vi /etc/profile
在末尾添加以下两行保存
#No core files by default 0, unlimited is oo
ulimit -S -c unlimited > /dev/null 2>&1
继续修改
$vi /etc/sysctl.conf
在末尾添加并保存
kernel.core_pattern = ./core_%t_%p_%e
kernel.core_uses_pid = 1
重启系统配置
$sysctl -p /etc/sysctl.conf
再查看core是否开启
2. 开始简单gdb调试
写一段C代码保存到heoo.c,并编译
$gcc -g -Wall -o heoo.out heoo.c
-g 表示开启使用gdb调试 -Wall 表示开启显示所有的警告
然后用gdb加载heoo.out 并开始调试
$gdb heoo.out
l 查看源码 , b 加断点, r 开始运行调试, n 下一步, s下一步但是会进入子函数. p 输出数据 c调到下一个断点处,q表示程序跳出
通过gdb houge.out core.[具体文件名]
开始调试. 马上定位出来了错误原因.
info args 查看当前函数参数值
info locals 看当前函数栈上值信息
info registers 表示查看寄存器值
查看内存信息: x /23dw a 意思是 查看 从a地址开始 23个 4字节 有符号十进制数 输出
用gdb查看内存格式:
x /nfu ptr
说明
x 是 examine 的缩写
n表示要显示的内存单元的个数
f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes)
ptr 表示从那个地址开始
设置条件断点: b 17 if i == 8. 在17行设置一个断点,并且只有i==8的时候才会触发.
删除断点: clear 行数或名称,删除哪一行断点