一、GDB调试器概述程序员
GDB是GNU开源组织发布的一个强大的程序调试工具,具备查看程序运行状态、设置断点、查看表达式、显示变量等众多功能,是程序员进行Linux编程必需要掌握的一种调试技术。正则表达式
GDB调试工具的优点主要包含如下5个方面:express
(1)用户能够在程序运行过程当中查看运行的状态;编程
(2)用户能够在程序中任何须要的地方设置断点,并暂停程序的执行;函数
(3)当程序暂停时,用户能够随时查看程序中各表达式、变量值以及内存值;工具
(4)程序暂停时用户能够进行单步调试,依此检查程序每步运行的结果是否跟预测值一致,而且能够检查每步出现的错误;优化
(5)用户能够改变程序中的变量或者执行顺序,来验证程序是否正确。ui
并非任何程序均可以使用GDB进行调试,要使用GDB进行调试必须知足两个条件:spa
(1)程序必须使用GCC进行编译,而且在编译过程当中添加“-g”调试信息选项。命令行
(2)要调试的可执行文件必须存在源程序代码,通常源程序代码存放的目录须要与可执行文件的目录相同。
以上两个条件缺一不可,若是不添加-g选项,GDB将不能获取调试信息;若是缺乏源程序代码,GDB将不能加载源文件并显示错误信息。
在gcc编译时,由于使用优化会改变程序的运行结果,因此建议读者不要使用-O优化选项,这样才能使生成的可执行文件和源代码保持一一对应的关系;其次,用户若是想生成更多的调试信息,可在GCC编译时使用-ggdb选项。
二、GDB的启动
GDB的启动方法很是简单,只需在命令行输入以下格式便可:
#gdb [options] [file]
此格式表示使用gdb调试工具对可执行文件file进行“options”调试。经常使用的选项以下:
-b baudrate 设置远程调试的串口波特率
--cd=DIR 进入gdb调试时改变当前路径到DIR目录
--quiet 启动gdb后不打印许可信息
--fullname 使用emacs-GDB交互显示输出信息
-w 使用窗口交互
-help 打印帮助信息
--se=File 使用File做为可执行文件和变量文件
--version 打印当前版本信息并退出
--command=File 进入gdb调试后执行File文件中的命令
三、GDB调试命令
启动gdb后,在gdb环境中输入help就会显示全部的帮助种类。gdb把命令分红不一样的类别,其中主要的种类包括:
(1)breakpoints:断点设置类
(2)data: 数据查看类
(3)files: 指定并查看文件类
(4)internals: 维护命令类
(5)running: 程序执行类
(6)stack: 调用栈查看类
(7)status: 状态查看类
(8)tracepoints:跟踪程序执行类
help命令只是列出gdb的命令种类,若是要看种类中的子命令,可使用help <class>命令,如:help breakpoints,表示查看设置断点的全部命令。
GDB中比较重要的4类命令介绍:
(1)断点设置类相关命令主要用来在调试程序中设置断点:
break 行号:在指定的行号上设置断点
break 函数:在“函数”名所在的行设置断点,使程序刚好在进入指定的函数前中止
info break:显示全部断点信息
delete 断点号:表示将指定的断点号删除,若是不指定要删除的断点号,系统默认删除全部断点号,断点号可经过info break的第一栏查询
disable 断点号:禁止指定的断点号,同delete同样,若是不指定断点号,则禁止当前文件下全部的断点
enable 断点号:激活指定的断点号,即激活被disable禁止的断点
ignore 断点号 num:在程序执行中,忽略对应断点num次
tbreak 行号或函数:设置临时断点,程序执行一次后,断点被自动删除
watch expression:设置一个表达式的观测点
clear [FILE:]NUM: 删除设置在特定源文件或者特定行上的断点
clear与delete都是清除断点,可是二者的区别在于,clear命令后面要给出清除的断点所在的行的行号,而delete命令是给出清除断点的编号;其次,使用clear命令清除断点时,gdb会自动给出提示,delete命令则不会。
(2)数据查看类相关命令能够用来查看程序中变量及内存信息:
display [expr]:在每次程序中止时自动显示对应表达式expr的内容
delete display [expr]:取消每次程序中止时显示对应表达式expr的内容
delete mem:删除内存区域中的内容
disable display [expr]:程序中止时禁止显示指定表达式expr的内容
undisplay [expr]:禁止显示指定表达式expr的内容
enable display [expr]:激活禁止显示的表达式expr
print [expr][name]:打印当前表达式或变量的内容
whatis [name]:显示变量的数据类型
ptype [name]:显示用户结构体的定义内容
print的显示格式:
/x 按十六进制格式显示变量
/d 按十进制格式显示变量
/u 按十六进制格式显示无符号整型
/o 按八进制格式显示变量
/t 按二进制格式显示变量
/a 按十六进制格式显示变量
/c 按字符格式显示变量
/f 按浮点数格式显示变量
dispaly能够用来设置一些自动显示的变量,当程序暂停时,或者用户单步跟踪时,这些变量的值将会自动显示;print只能显示当前用户指定的变量或者表达式的值,当程序下一次单步执行或者暂停时,不会显示上次设定变量的值。
(3)文件查看类命令主要用于程序文件的查看以及程序的编辑:
cd DIR:将工做目录设置在DIR下
directory DIR:在搜寻源文件时也搜索DIR目录
file File:表示加载指定文件File进gdb
search 正则表达式及变量:向前搜索正则表达式及变量
foward-search 正则表达式及变量:向前搜索正则表达式
reverse-search 正则表达式及变量:向后搜说正则表达式
pwd:打印当前工做目录
path DIR:在搜索文件路径时也搜索DIR目录
load file:在运行程序时,动态加载file文件
list [行号][函数名]:列出对应于正在执行的程序的源文件内容,后面不加任何参数表示显示10行源文件内容。list也可以使用其缩写形式l
info line:显示加载到内存中的代码
(4)程序控制相关命令
在使用GDB调试过程当中大体分为3中状态:运行态、暂停态以及结束态,其中暂停态使程序暂停在某个断点处,它在程序调试中用的最多;结束态是用户调试完毕,要跳出gdb的状态,在此状态下没法查看各类变量的值;运行态是除暂停态和结束态以外的全部状态。
run:表示执行程序
continue:继续执行正在调试的程序,该命令用在程序因为处理信号或断点致使中止运行时
interrupt:中断调试程序的执行
next:单步调试程序,不进入子函数单步执行
nexti:单步调试一条指令
step:单步调试程序,进入子函数单步执行
kill:终止正在调试的程序
set args:当被调试程序开始运行时,设置程序的参数列表
set environment:设置程序环境变量的值
show args:显示一开始调试程序的参数列表
set step-mode:设置单步运行的模式
show step-mode:显示单步运行的模式
finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
until:结束当前循环
make:在不退出gdb的前提下执行make命令