gdb通常和gcc命令一起使用,编译选项加入-g
才可使可执行文件处于debug模式。
而处于debug模式的可执行文件,gdb才能对每条指令找到它对应源代码的行号。
gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev]
[-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir]
[prog[core|procID]]
gdb [可执行文件]:选中可执行程序,进入gdb的debug模式; (gdb) b(breakpoint):用法:b 函数名 :对此函数进行中断 ;b 文件名:行号; (gdb) run:启动程序,运行至程序的断点或者结束; (gdb) l(list):用法:l funcname,制定函数的源码。或者l linenum,显示指定行周围的源码。或l -,显示当前行前面的源码。或l,显示当前行后面的源码; (gdb) s(step):进入函数,逐语句运行; (gdb) n(next):不进入函数,逐过程运行; (gdb) c(continue):继续运行,跳至下一个断点; (gdb) p(print):打印显示变量值; (gdb) set variable=value,为变量赋值; (gdb) kill:终止调试的程序; (gdb) h(help):列出gdb详细命令帮助列表; (gdb) clear filename.c:30:清除30行处的断点; (gdb) info break:显示断点信息; (gdb) delete 断点编号:断点编号是info break 后显示出来的; (gdb) bt(backtrace):回溯到段出错的位置; (gdb) frame 帧号:帧号是bt命令产生的堆栈针; (gdb) q:退出;
r重头运行,c继续运行。
b,打断点。
b 函数名,或者b *地址
以条件表达式设置断点
(gdb)break 7 if i==99
查看当前设置的断点信息
info breakpoints
delete可删除单个断点。
delete 5
也可删除一个断点的集合,这个集合用连续的断点号来描述。
delete 1-10
序号的获取,用上面的info breakpoints即可。
info registers,显示所有的寄存器,可简写为i r。
info registers eax,只显示%eax,可简写为i r eax。
查看变量
p 变量名
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
按二进制打印一个浮点数,定义方式为【double x】。
x 地址,或x &变量名,查看内存内容。
格式尾数,b表示单字节,h表示双字节,w表示四字节,g表示八字节。
gdb默认w,4字,32位。
当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
同一个作者的两篇文。
https://cloud.tencent.com/developer/article/1177167
https://blog.youkuaiyun.com/liigo/article/details/582231