GDB 基本用法
2013-05-30 20:15
337 查看
1、带着调试选项编译、构建调试对象
在原来的的选项上再加上 -g 选项,如 gcc -g -Wall -O2 -o test test.c 或者 gcc -g -o test test.c。有一点需要注意的是调试时最好去掉优化选项,比如内联(inline)函数优化(去掉函数调用,而将函数代码在调用的位置展开),该函数名上就无法设置断点。这是因为内联函数优化从目标文件中去掉了该函数的入口点,符号表中也没有该函数的名称。优化还会将局部变量保存到寄存器中,因此无法显示该局部变量的内容,必须直接查看寄存器的值。当然,如果程序确实需要优化那么还是应该直接调试带有优化选项的可执行文件版本,因为只管理优化了的版本的可执行文件比管理优化的+没有优化的两个版本的可执行文件更加简单。2、启动调试
2、1 gdb 可执行文件名。 如,gdb test 或 gdb test.exe2、2 先键入 gdb 然后 file test 或 file test.exe
3、调试
3、1断点
3、1、1设置断点
设置断点命令为 break ,可以简写为 b 。格式:break 函数名,如 break main
break 行号,如 break 100
break 文件名:行号,如 break test.c:100
break 文件名:函数名,如 break test.c:tet
break +偏移量 如 break +100
break -偏移量 如 break -100
break *地址 如 break *0x08116fd6
break (即不指定断点位置),在下一行代码上设置断点,如 break
3、1、2查看断点信息
info break3、1、3删除断点
delete 3//删除第三个断点clear //清楚所有断点
3、2运行
没有参数时: run有参数时: run 参数,如 run hello 。注意,此时参数从 argv[1] 开始,因为在运行 gdb test 或 file test时就传入了第一个参数argv[0]。
3、3显示栈
backtrace命令可以在遇到断点而暂停执行时显示栈帧,可简写为bt。此外backtrace的别名还有where和info stack。3、3、1显示所有栈帧
backtrace3、3、2只显示开头 N 个栈帧
backtrace N,如 backtrace 3 只显示前3个栈帧3、3、3只显示最后 N 个栈帧
backtrace -N,如backtrace -3 只显示最后3个栈帧3、3、4同时显示栈帧及其局部变量
backtrace full//显示所有栈帧及其局部变量backtrace full N//显示前 N 个栈帧及其局部变量
backtrace full -N//显示最后 N 栈帧及其局部变量
3、4显示变量
print命令可以显示变量,同时可以简写为 p 。用法如下:p argv
p *argv
p argv[0]
p argv[1]
3、5显示寄存器
3、5、1显示所用寄存器
info reg3、5、2显示单个寄存器
p $eax//即在寄存器名前面加上$即可3、6显示内存
用 x 命令可以显示内存中内容。其一般格式为:x/nfu addr。
nfu是可选的,如果采用默认的nfu就可以不需要加斜线“\”
n,重复的次数
重复数是十进制整数,默认为1。他确定显示多少单元内存(单元由 u 确定)
f,显示格式
显示格式是被print命令使用众多格式之一('x','d','u','o','t','a','c','f','s')另外还有'i'(机器指令)。最初默认的是'x'(16进制)。在你每次使用 x 或者 print 命令之后默认值都会随之发生改变。
u,单位大小
单位大小可以是一下任何之一:
bBytes
hHalfwords(two bytes)
wWords(four bytes).最初的默认值。
gGiant words(eight bytes)
对于格式 'i' ,单位大小是被忽视了的而且通常不写。
addr,开始显示的地址
addr是你想GDB显示内存内容的开始地址。该表达式没必要必须是一个指针值(虽然他可能是);他始终被表述为一个字节内存的整型地址。
例如'x/3uh 0x54320'命令表示显示从地址0x54320开始的以无符号十进制数的3个半字的内容。
3、7反汇编
反汇编命令为disassemble,简写为disas。disassemble。---- 反汇编当前整个函数。
disassemble 程序计数器。--- 反汇编以程序计数器值为地址所在的函数。
disassemble 开始地址 结束地址。--- 反汇编从开始地址到结束地址之前的部分。执行时可能想执行到函数内部,此时可以使用 (step 简写为 p)命令。
3、8单步执行
单步执行的意思是根据源代码一行一行的执行。执行源代码中一行的命令为 next (简写为n)3、9 继续执行
调试时,可以使用continue(简写为 c )命令继续运行程序。程序在遇到断点后再次暂停运行。如果没有断点就会一直运行到就会一直运行到结束。格式:continue
continue 次数 //忽略断点的次数
3、10 监视点
大型软件或者大量使用指针的程序中,很难弄清楚变量在什么地方被改变。想要找到变量在何处被改变,可以使用watch命令(监视点,watchpoint)。wath <表达式>。<表达式>发生变化时暂停运行。此处<表达式>的意思是常量或者变量。
awatch <表达式>。<表达式>被访问、改变时暂停运行。
rwatch <表达式>。<表达式>被访问是暂停运行。
3、11 改变变量的值
格式:set variable <变量>=<表达式>。例如,set variable i = 0 。