GDB调试工具使用方法

一、GDB调试工具功能

  1. 启动被调试的工具
  2. 使被调试的程序在指定位置停住
  3. 当程序被停住时,可以检查程序此时的状态,如变量的值等

为了使调试器实现上述功能,可以使用下述5条命令进行操作:
(1)启动程序。启动程序时,可以设置程序的运行环境,使程序在GDB调试环境下。
(2)设置断点。在运行程序时,程序会在断点处停住,方便用户查看程序此时运行的情况。
(3)查看信息。可以查看与可执行程序相关的各种信息。
(4)分布运行。可以使代码一句一句地执行,方便及时查看程序的信息。
(5)改变环境。可以在程序运行时改变程序的运行环境和程序变量。

二、调试步骤

  1. 编写C/C++原程序
  2. 使用gcc编译器生成可执行文件,格式:gcc -g -o 可执行文件名 源程序文件名
  3. 运行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条件

删除断点

  1. delete
    格式:delete 断点编号

  2. 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 变量名/表达式

猜你喜欢

转载自blog.csdn.net/qq_37733540/article/details/95307133