Linux--GDB调试指南

张开发
2026/4/16 8:08:16 15 分钟阅读

分享文章

Linux--GDB调试指南
Linux--GDB调试指南一、前言二、什么是调试三、GDB是什么四、GDB调试器可以实现的功能五、GDB/CGDB的使用5.1、样例代码5.2 Debug版本和Release版本的区别六、 GDB指令学习6.1 指令汇总6.2指令演示一、前言GNU symbolic debugger简称「GDB调试器」是 Linux 平台下最常用的一款程序调试器。GDB 编译器通常以 gdb 命令的形式在终端Shell中使用它有很多选项这是我们要重点学习的。发展至今GDB 调试器已经对 C、C、Go、Objective-C、OpenCL、Ada 等多种编程语言提供了支持。实际场景中GDB 更常用来调试 C 和 C 程序虽然 Linux 平台下有很多能编写 C、C 代码的集成开发工具IDE但它们调试代码的能力往往都源自 GDB 调试器。二、什么是调试调试是开发流程中一个非常重要的环节每个程序员都应具备调试代码的能力尤其对于从事 Linux C/C 开发的读者必须具备熟练使用 GDB 调试器的能力。这套 GDB 入门教程通俗易懂深入浅出能让你快速学会使用 GDB 编译器。调试就是一步一步的执行代码行观察代码的运行状态可以查看程序的变量和地址数据。我们可以快速定位到错误代码的位置从而改进代码。三、GDB是什么在Windows 操作系统中人们更习惯使用一些已经集成好的开发环境IDE如 VS、VC、Dev-C 等它们的内部已经嵌套了相应的调试器。四、GDB调试器可以实现的功能程序启动时可以按照我们自定义的要求运行程序例如设置参数和环境变量可使被调试程序在指定代码处暂停运行并查看当前程序的运行状态例如当前变量的值函数的执行结果等即支持断点调试程序执行过程中可以改变某个变量的值还可以改变代码的执行顺序从而尝试修改程序中出现的逻辑错误。五、GDB/CGDB的使用5.1、样例代码#includestdio.hintSum(ints,inte){intresult0;for(intis;ie;i){resulti;}returnresult;}intmain(){intstart1;intend100;printf(I will begin\n);intnSum(start,end);printf(running done, result is: [%d-%d]%d\n,start,end,n);return0;}Makefile文件程序的发布方式有两种debug模式和release模式Linux gcc/g默认是release模式要使用gdb调试必须在源代码生成二进制程序的时候加上-g选项如果没有添加程序无法被编译。加上-g就变成了debug模式了5.2 Debug版本和Release版本的区别Debug调试版本用于开发、调试、找Bug不追求性能只追求方便调试。Release发布版本用于**正式发布*、给用户使用*、不保留调试信息极致优化性能六、 GDB指令学习6.1 指令汇总llist———— 显示源代码从上次位置开始每次列出10行rrun———— 从程序开始连续执行nnext————单步执行不i进入函数内部逐过程F10sstep————单步执行进入函数内部逐语句F11bbreak————在指定行号设置断点binfo break————查看当前所有断点的信息finish————执行到当前函数返回然后停止pprint表达式 ————打印表达式的值p 变量————打印指定变量的值set var 变量值————修改变量的值-ccontinue————从当前位置开始连续执行程序ddeletet————删除序号为n的断点disable breakpoints————禁用所有断点enable breakpoints————启用所有断点6.2指令演示接下来让我们进入到指令的演示让我们对代码有一个基本的调式能力首先进入到gdb输入gdb启动调试之后会出现下面的(gdb)llist———— 显示源代码从上次位置开始每次列出10行一般直接【l】会随机显示出该文件的内容如果我们想从第一行开始执行【l 0】就可以从第0行开始展示10行内容如果想要重复执行看到我们的所有代码只需要多enter几次就可以了gdb会自动记忆上次敲的指令运行代码rrun———— 从程序开始连续执行rrun的缩写作用启动/重新运行你的程序进入gdb后程序默认是暂停的不会自己跑输入r程序就回从头开始执行直到运行结束遇到断点程序奔溃著过程和逐语句nnext————单步执行不i进入函数内部逐过程F10按下【n】之后会直接运行到断点处不会进入到断点内部sstep————单步执行进入函数内部逐语句F11会进入函数内部设置断点bbreak————在指定行号设置断点b行号会直接在对应行设置断点b 源文件函数名—在该函数的第一行打上断点** 查看断点信息**binfo break————查看当前所有断点的信息若直接执行【info】的话出来的就是所有的调试信息若只是想看一下所有断点的信息就在后面加一个b/breakpoint删除断点ddeletet————删除序号为n的断点d当前要删除断点的编号—不可以直接【d行号】

更多文章