一、GDB调试工具功能
- 启动被调试的工具
- 使被调试的程序在指定位置停住
- 当程序被停住时,可以检查程序此时的状态,如变量的值等
为了使调试器实现上述功能,可以使用下述5条命令进行操作:
(1)启动程序。启动程序时,可以设置程序的运行环境,使程序在GDB调试环境下。
(2)设置断点。在运行程序时,程序会在断点处停住,方便用户查看程序此时运行的情况。
(3)查看信息。可以查看与可执行程序相关的各种信息。
(4)分布运行。可以使代码一句一句地执行,方便及时查看程序的信息。
(5)改变环境。可以在程序运行时改变程序的运行环境和程序变量。
二、调试步骤
- 编写C/C++原程序
- 使用gcc编译器生成可执行文件,格式:gcc -g -o 可执行文件名 源程序文件名
- 运行GDB调试工具,格式一:gdb 可执行文件名,格式二,gdb 回车,file 可执行文件名 回车
三、GDB调试命令
1. 启动GDB调试程序
使用GDB调试程序时,必须要让GDB可以获得程序的信息,因此需要在编译程序时,加入参数-g,编译命令如下:
gcc -g -o 可执行文件名 源程序文件名
生成一个带有调试信息的可执行文件,由此,可以使用如下命令语句加载可执行文件程序,进入到GDB调试工具中:
gdb 可执行文件
进入GDB调试工具的另一种方法是,可以先输入GDB命令(在命令行中输入“gdb ”,回车),然后通过文件命令加载可执行文件,例如:
file 可执行文件名
2. 设置/删除/断点
设置断点
目的:在该点处中断程序的运行,方便观察程序状态,并且可以单步跟踪后续代码。
方法:
//运行到某行停止
break 行号
//程序进入指定功能函数时停止
break 函数名
//符合if语句条件时,运行到指定位置停止运行
break 行号/函数名称 if条件
删除断点
-
delete
格式:delete 断点编号 -
clear
格式:clear 断点所在行号
查看断点
可使用info breakpoints查看断点信息。
3. 运行程序run
run命令就相当于平时的./程序,例如需要输入./client 10.144.42.88 4321可以启动./client程序,这里就需要输入run 10.144.42.88 4321
当设置完断点以后,运行run,就会将程序运行到断点处。
4. 继续运行程序continue
程序运行到断点处后,希望程序继续往下运行,则需要输入continue命令,如果后面后面没有断点了,则程序会持续运行。
5. 逐条运行step
程序会一步一步运行,可以使用快捷键s,有的Linux系统支持回车键会执行上次输入的命令,也可以按回车。
有时候会出现No such file or directory.这行提示符,则需要输入finish命令,然后再step
6. 单步运行next
next 是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。在其他调试器中相当于step-over,作用是在同一个调用栈层中移动到下一个可执行的代码行。调试器不会进入函数体。如果当前行是函数的最后一行,则,next将进入下一个栈层,并在调用函数的下一行停止。
7. finish
finish就是但单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数。在其他调试器中相当于step-out,作用是在栈中前进到到下一层,并在调用函数的下一行停止。
8.gdb 中step,next与finish的区别
step 就是单步执行,遇到子函数就进入并且继续单步执行;在其他调试其中相当于step-into命令,作用是移动到下一个可执行的代码行。如果当前行是一个函数调用,则调试器进入函数并停止在函数体的第一行。step可以帮助初步揭开代码位置的谜团,例如:函数调用和函数本身可能在不同的文件中。
next 是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。在其他调试器中相当于step-over,作用是在同一个调用栈层中移动到下一个可执行的代码行。调试器不会进入函数体。如果当前行是函数的最后一行,则,next将进入下一个栈层,并在调用函数的下一行停止。
finish就是但单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数。在其他调试器中相当于step-out,作用是在栈中前进到到下一层,并在调用函数的下一行停止。
三、检查数据的功能及命令
1.显示变量或者表达式的值
格式:print 变量名/表达式