简单gdb调试

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是否开启
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 行数或名称,删除哪一行断点

非常详细的原文

猜你喜欢

转载自blog.csdn.net/mrbacker/article/details/79755979
今日推荐