GDB是一个交互式的调试工具,在linux系统中可以很好地帮助我们完成程序的调试。
它的主要功能有:
1. 设置断点,让程序直接运行至可能出错的地方
2. 查看变量的值,在调试过程中随时查看我们关注的变量的值。
3. 修改变量的值,这是VS的调试器所不具有的功能,可以帮助我们更快的定位程序的问题所在。
那么gdb调试工具要怎么用呢?
1. 首先编译可执行程序的时候需要增加额外的编译选项-g. 例如,源码为example.c的文件需要用gcc -g -o example example.c.
2. 运行gdb example,进入到gdb调试命令行的输入界面。
3. 进入到调试界面以后如何调试呢?接下来介绍几个比较有用并且调试中常用的命令。
(1)list命令,显示源文件的内容,可以用list 4,8只显示第4行到第8行的内容。
(2)break line-number, break function-name, break line/functionname if condition, break filename:line-number/function-name
分别对应在指定行号设置断点,函数名字前设置断点,满足condition条件时断点有效,在相应源文件的某行/某函数设置断点。
(3)info break,显示当前设置的所有断点。
(4)run,运行程序,在断点处停下
(5)print i, 打印变量当前值;print expression,打印任意表达式的值;print func(i),打印调用某函数的返回值。
(6)step,单步执行;next, 单步执行不进入函数;continue,继续运行至下一个断点。
(7)set variable i=7,设置变量的值。
(8)clear line-num,删除指定的断点,使用delete删除所有的断点。
(9)whatis i/whatis function-name,查看制定变量的数据类型或者函数的类型。type = int/ type = int (void)
附1 更多gdb命令
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条continue命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在gdb 控制下运行的程序
list 列出相应于正在执行的程序的原文件内容
next 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构(如一个结构或C++类)的内容
quit 退出gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable 给变量赋值
signal 将一个信号发送到正在运行的进程
step 执行下一个源程序行,必要时进入下一个函数
undisplay display命令的反命令,不要显示表达式
until 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点)
whatis 显示变量或函数类型
附2 查看和修改程序通用寄存器
有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:
l $pc : 程序计数器
l $fp : 帧指针(当前堆栈帧)
l $sp : 栈指针
l $ps : 处理器状态
使用print $pc打印各寄存器的值。