GDB 调试命令

常用

break                 b               设置断点。
run                     r               开始运行程序。运行到第一个断点位置,如果没有断点就直接运行结束。
next                   n               执行当前行。如果当前行包含函数调用,不会进入函数。
step                   s               执行当前行。如果当前行包含函数调用,则进入函数,执行函数体第一条语句。注意,如果函数是库函数或者第三方提供的函数,由于没有源代码,也无法进入函数体。
print                   p               显示变量或表达式的值。
continue            c               继续运行程序,直到下一个断点或者程序结束。
set var name = value                    设置变量的值。
quit                    q               退出gdb环境。

finish                fin                跳出当前函数

(gdb) list/l 行号或函数名 //列出源码
(gdb) l 30
25              int* pa = new int[10];
26              memset(pa, 10*sizeof(int), 0);
27              printf("pa[0]:%d, pa[-1]:%d\n", pa[0], *(pa-4));
28              pa[1] = 1, pa[2]=2, pa[3]=3;
29              --pa;
30              printf("cur *pa:%d\n", *pa);
31      }
32
33      int main()
34      {
(gdb) break 29
Breakpoint 2 at 0x4007be: file mem.cpp, line 29.

其他

显示内容太多出现省略号时执行:set print elements 0,之后就会显示全部内容

backtrace/bt //查看函数调用栈帧

frame/f //选择栈帧,再查看局部变量

p *array@len //打印指针array指向地址的len长度的内容

print *(int*)p@10 //以int格式打印指针p指向地址中10长度的值

set var sum=0 //修改变量值

set args  设置主程序的参数

display/undisplay sum //每次停下显示变量的值/取消跟踪

delete breakpoints 2 //删除某个断点

disable/enable breakpoints 3 //禁用/启用某个断点

break 9 if sum != 0 //满足条件才激活断点

watch input[4] //设置观察点

x/7b input //打印存储器内容,b--每个字节一组,7--7组

disassemble/disas //反汇编当前函数或指定函数

si // 一条指令一条指令调试 而 s 是一行一行代码

thread apply bt all 调试core时查看所有线程堆栈

GDB时的x命令

x/<n/f/u> <addr>

x:examine的缩写

n、f、u是可选的参数。

n 是一个正整数,表示显示内存的长度

也就是说从当前地址向后显示几个地址的内容。

(gdb) x/1 pa
0x602010:       0
(gdb) x/2 pa
0x602010:       0       1
(gdb) x/3 pa
0x602010:       0       1       2
(gdb) x/4 pa
0x602010:       0       1       2       3
 

f 表示显示的格式

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

(gdb) x/4d pa
0x602010:       0       1       2       3
(gdb) x/4x pa
0x602010:       0x00000000      0x00000001      0x00000002      0x00000003
(gdb) x/4u pa
0x602010:       0       1       2       3
(gdb) x/4o pa
0x602010:       0       01      02      03
(gdb) x/4t pa
0x602010:       00000000000000000000000000000000        00000000000000000000000000000001        00000000000000000000000000000010        00000000000000000000000000000011

u 表示从当前地址往后请求的字节数

如果不指定的话,GDB默认是4个bytes。

u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。

当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

(gdb) x/4dh pa
0x602010:       0       0       1       0
(gdb) x/16db pa
0x602010:       0       0       0       0       1       0       0       0
0x602018:       2       0       0       0       3       0       0       0
(gdb) x/16b pa
0x602010:       0       0       0       0       1       0       0       0
0x602018:       2       0       0       0       3       0       0       0
(gdb) x/16h pa
0x602010:       0       0       1       0       2       0       3       0
0x602020:       0       0       0       0       0       0       0       0
(gdb) x/16w pa
0x602010:       0       1       2       3
0x602020:       0       0       0       0
0x602030:       0       0       135121  0
0x602040:       0       0       0       0

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangcpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值