c = co = cont = continue
s = step and si = stepi
n = next
step:下一条指令(如果有函数,进入函数(内核提供的函数进不去))。
next:下一条指令(不进入函数)。
si和ni针对汇编指令而不是代码行。
continue(c):执行到下一个断点。
finish:一直执行代码直至当前函数返回。
advance <location> :一直执行代码直到。
break <location> :设置断点(b 函数名或者b 代码行数)
断点可以是addresses (“ *0x7c00 ”)、names (“mon backtrace ”, “ monitor.c:71 ”).
使用delete, disable, enable修改断点。
break <location> if <condition>使用条件。
cond <number> <condition>在断点添加条件。
x 打印内存中的内容 (x/x 16进制 , etc x/s 0x...,以char*类型打印).
print :打印C表达,有时比x更好用。(p $rax )
info registers:打印寄存器中的值。
info frame :打印当前栈帧。
list <location> :打印 特定位置的源代码。
backtrace:?
layout <name> :提供可视化界面查看信息(layout asm以汇编代码查看,layout src以源代码的方式查看)
disas 函数名:查看函数的汇编代码
set var 变量 = 设置变量的值
set args :设置主程序的参数
./demo a b c => (gdb) set args a b c
打印出存储在地址
0x7fffffffe340
处的整型值
p *(int*) 0x7fffffffe340
*(int*)
是一个类型转换,将一个指针转换为一个指向整型的指针。在这个例子中,它告诉GDB在内存地址0x7fffffffe340
处存储的是一个整型值。
vim hello.c
编译gcc -g hello.c,生成a.out(需要加上-g参数)
调试:gdb ./a.out
出现Reading symbols,说明成功进入gdb。
start:开始调试
list:查看源代码
step:进入下一步
info locals:查看变量