GDB常用命令
info reg:查看寄存器状态。
info locals:查看局部变量
info line n:显示第n行代码在内存中的对应位置
r:运行
n:单步执行
s:单步调试,可以跟踪进函数。
c:继续运行
b n:在第n行设置断点
info b:显示所有断点
clear n:清除第n行断点
clear:清除所有断点
list <linenum>:显示程序第linenum行周围的源程序
list <function>:显示函数名为function的函数的源程序
list:显示当前行后面的源程序。
list - :显示当前行前面的源程序。
print <expr>
print /<f> <expr>
<expr>是表达式,是被调试的程序中的表达式,<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x
watch <expr>:一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。
disassemble:命令用于反汇编,它可被用来查看当前执行时的源代码的机器码,其实际上只是把目前内存中的指令dump出来。下面的示例用于查看函数func的汇编代码:
(gdb) disassemble func
bt或Backtrace:打印当前的函数调用栈的所有信息。如:
(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
从上可以看出函数的调用栈信息:__libc_start_main --> main() --> func()
backtrace <n>, bt <n> n是一个正整数,表示只打印栈顶上n层的栈信息。
frame 或 f:查看当前栈层的信息,会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。
info frame或info f 这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如:
(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame's sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8
info args:打印出当前函数的参数名及其值。
x /nfu 0x<addr>:查看内存地址中的值。
l n表示要显示的内存单元的个数
l f表示显示方式, 可取如下值
u x 按十六进制格式显示变量。
u d 按十进制格式显示变量。
u u 按十进制格式显示无符号整型。
u 按八进制格式显示变量。
u t 按二进制格式显示变量。
u a 按十六进制格式显示变量。
u i 指令地址格式
u c 按字符格式显示变量。
u f 按浮点数格式显示变量。
l u表示一个地址单元的长度
u b表示单字节,
u h表示双字节,
u w表示四字节,
u g表示八字节