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/

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

你可能感兴趣的:(c++)