GDB调试
GDB是GUN发布的一个强大的程序调试工具,也是Linux程序员不可或缺的一大利器。
安装GDB
注意安装你所需要的版本。
- wget http://ftp.gnu.org/gnu/gdb/gdb-8.1.1.tar.gz
- tar -zxvf gdb-8.1.1.tar.gz
- cd gdb-8.1.1
- ./configure
- make
- make install
启动GDB
使用GDB的前提
gcc -g hello.c -o hello
启动GDB调试
gdb hello
GDB和Shell一样支持命令补全。
获取帮助命令
GDB将命令分为12个大类,使用命令 "help 子类别",可以查看每个类下面的详细帮助。
help breakpoints
设置断点
- break
break命令用于设置断点,命令行接受行号或者函数名作为参数。
例1:设置以函数test()为断点,执行到调用这个函数的时候程序暂停。
break test()
例2:设置第二行为断点
break 2
查看断点
- info
info break
删除断点
- delete
delete + 断点编号
delete 2
- clear
clear 删除指定位置的所有断点
例:删除函数test附近的所有断点
clear test
运行程序和单步执行
- run
设置完断点后 执行 run 命令,运行程序。
run
程序中断后,等待用户发出下一步命令的操作。
- next命令
next命令单步执行程序,缩写为n。也可指定执行行数。
例1:
n
例2:
n 3
- continue
continue命令继续执行,直到遇到下一个断点。缩写为c。
c
- step
或者继续使用单步执行next,再或是使用step,缩写s。next与step的最大区别是,step遇到函数是会进入到函数内部的,而next不会(而是当做一条语句)。
next逐过程,step逐语句。
s
监视变量
调试程序最基本的需求就是监视变量的值,可以使用print命令,缩写为p,显示指定变量的值。
print count
- watch
为了更方便的监视某一变量,使用watch,来时刻监视某一变量或表达式,只要它发生了变化,就会停下来。并给出提示。
watch count
临时修改变量
- set var
某些情况我们需要让程序进入一些特殊的流程,例如进入了一个循环,我们可以修改控制循环变量的值,来跳转到指定的循环次数。gdb允许用户在程序运行时改变变量的值,通过set var命令来实现。
set var count = 4
查看堆栈情况
- bt
每次调用一个函数,函数的地址、参数、以及内部变量都会被压入栈中,运行时的堆栈信息对于程序员非常重要,使用"bt"命令可以看到当前运行时栈的情况。
bt
退出GDB
- quit
调试完毕后,使用quit命令,缩写为q,退出gdb程序。
q