GDB是一套字符界面的程序集,可以使用命令gdb加载要调试的程序。要使用GDB进行调试,在编译程序的时候需要加入-g选项。
使用GDB调试程序
加载程序
使用GDB调试程序时,需要先将程序加载到GDB中,加载程序的命令格式:
gdb 要调试的文件名
如果在启动GDB的时候没有选择程序名称,可以在GDB启动后使用“file + 要调试的文件名”的方法启动。
设置输入参数
通常可执行文件在运行时需要输入参数,GDB中向可执行文件输入参数的命令格式:
set args 参数值1 参数值2 ...
使用“show args”命令就可以查看其默认的参数。
打印代码
命令list(也可以使用简写l)用于列出可执行文件对应源文件的代码,命令格式:
list 开始的行号 结束的行号
如果不输入参数,则从当前行开始打印。之后每次按Enter键后顺序向下列出代码。
打印数据
打印变量或表达式的值可以使用print命令(也可以使用简写p)
设置断点
break命令(也可以使用简写b)在某一行或者某个函数名称设置断点,程序运行到断点的位置会中断,等待用户的下一步操作命令。命令格式:
b 行号|函数名称
设置一个条件断点可以使用break if命令,在调试循环代码时这样的设置比较有用。
使用“info break”命令显示当前断点的信息。
删除某个指定的断点使用命令delete,命令格式:
delete breakpoint 断点编号
禁止某个断点使用命令disable,断点禁止后,GDB调试时在断点处程序不再中断,命令格式:
disable breakpoint 断点编号
允许断点使用命令enable,将禁止的断点重新启动,命令格式:
enable breakpoint 断点编号
清除断点,一次性清除某行处的所有断点使用命令clear,命令格式:
clear 源代码行号
运行程序
GDB在默认情况下是不会让可执行文件运行的,要使程序运行需要输入run命令(也可以使用简写r)。run命令后面可以携带要传递给程序的参数。如果使用不带参数的run命令,GDB就再次使用前一条run命令的参数。
单步调试
nxet命令是单步跟踪命令,简写为n。step命令也是单步调试命令,是可以进入函数体的命令,简写为s。如果进入某个函数后想退出函数体返回到调用的函数中,可以使用命令finish。
设置监测点
命令display可以显示变量的值,在结束或者遇到断点的时候,将设置变量的值显示出来。至于是否显示还要看变量的作用域,display只显示作用域内变量的值。
修改变量的值
使用set命令修改变量的值。
退出GDB
在调试完程序后,使用q命令退出GDB。
变量类型检测
在调试过程中有需要查看变量类型的情况,打印数组或者变量的类型使用whatis命令,命令格式:
whatis 变量名
whatis命令只能获得变量的类型名称,不能得到类型的星系信息,查看变量详细信息使用命令ptype命令。
调用路径
backtrace命令(简写为bt)可以打印函数的调用路径,提供向前跟踪功能。该命令会打印一个顺序列表,函数从最近到最远的调用过程,包括调用函数和其中的参数。
信息info
info命令可以获得当前命令的信息,例如获得断点的情况,参数的设置情况等。
多线程thread
多线程的调试主要是先获得线程的ID号,然后转到该线程进行调试。
info thread命令列出当前进程中的线程号,其中最前面的为调试用的ID。
用thread id进入需要调试的线程。
汇编
disassamble命令打印指定函数的汇编代码。
GDB的帮助信息
在GDB中,输入help命令来获得帮助信息。