💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++🔹Liunx
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
- 一、GDB引入
- 二、gdb指令大全汇总
- 三、make/makefile知识回顾
- 四、指令演示
- 1.进入gdb
- 问题排查
- 2.行号显示
- 3.断点设置
- 4.查看断点信息
- 5.删除断点
- 6. 运行 / 调试
- 7.逐过程和逐语句
- 8.跟踪打印
- 9.查看函数调用
- 10.指定行号跳转
- 11.强制执行函数
- 13.跳转到下一断点
一、GDB引入
我们在vs2019中进行调试,可以使用基本调试键F5、F9、F10、F11等对代码进行调试,它是一种可视化的操作,使用起来很方便易懂。但是在linux中,,想对一段代码去进行调试呢,此时就要使用到Linux下的调试器gdb。
二、gdb指令大全汇总
l(list) 行号/函数名 | 显示对应的code,每次10行 |
---|---|
r(run) | F5【无断点直接运行、有断点从第一个断点处开始运行】 |
b(breakpoint) + 行号 | 在那一行打断点 |
b 源文件:函数名 | 在该函数的第一行打上断点 |
b 源文件:行号 | 在该源文件中的这行加上一个断点吧 |
info b | 查看断点的信息breakpoint already hit 1 time【此断点被命中一次】 |
d(delete) + 当前要删除断点的编号 | 删除一个断点【不可以d + 行号】若当前没有跳出过gdb,则断点的编号会持续累加 |
d + breakpoints | 删除所有的断点 |
disable b(breakpoints) | 使所有断点无效【默认缺省】 |
enable b(breakpoints) | 使所有断点有效【默认缺省】 |
disable b(breakpoint) + 编号 | 使一个断点无效【禁用断点】 |
enable b(breakpoint) + 编号 | 使一个断点有效【开启断点】相当于VS中的空断点 |
enable breakpount | 使一个断点有效【开启断电】 |
n(next) | 逐过程【相当于F10,为了查找是哪个函数出错了】 |
s(step) | 逐语句【相当于F11,】 |
bt | 看到底层函数调用的过程【函数压栈】 |
set var | 修改变量的值 |
p(print) 变量名 | 打印变量值 |
display | 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】 |
undisplay + 变量名编号 | 取消对先前设置的那些变量的跟踪 |
排查问题三剑客 | 如下 |
until + 行号 | 进行指定位置跳转,执行完区间代码 |
finish | 在一个函数内部,执行到当前函数返回,然后停下来等待命令 |
c(continue) | 从一个断点处,直接运行至下一个断点处【VS下不断按F5】 |
三、make/makefile知识回顾
为了更好的演示指令,我们需要先创建一个test.c文件,以供调试。
使用vim
编辑如下代码。
1 #include<stdio.h>2 3 int Sum(int n) 4 {5 int i=1;6 int sum =0;7 for(;i<=n;i++)8 {9 sum+=i;10 }11 return sum;12 }13 14 int main()15 {16 printf("hello world\n");17 int result = Sum(100);18 printf("result = %d\n",result);19 return 0;20 }
~
并创建Makefile
文件配置。
make
一下,发现成功打印出来结果。
四、指令演示
1.进入gdb
使用格式:
gdb 可执行程序
前提是在【Debug】环境下运行。
问题排查
出现下面问题,通常是没有处于调式模式环境下,所以我们需要在gcc指令后加 【-g】。
因为,我么的gcc编辑器默认是动态链接,而且是realese发布版本。
2.行号显示
l(list) 行号/函数名
—— 显示对应的code,每次10行
- 单单使用【l】,随机显示10行
- 【l+数字】,从该数字开始打印10行
- 【enter】继续打印10行
3.断点设置
b + 行号 | 在那一行打断点 |
---|---|
b 源文件:函数名 | 在该函数的第一行打上断点 |
b 源文件:行号 | 在该源文件中的这行加上一个断点 |
第一种:b + 行号
第二种:b 源文件:函数名
第三种:b 源文件:行号
4.查看断点信息
【info】:查看所有调式信息
【info b】:显示所打的断点的信息
对上述产看信息的字段解释:
1️⃣ Num —— 编号
2️⃣ Type —— 类型
3️⃣ Disp —— 状态
4️⃣ Enb —— 是否可用
5️⃣ Address —— 地址
6️⃣ What —— 在此文件的哪个函数的第几行
5.删除断点
【d + 当前要删除断点的编号】——删除一个断点
注意:不是d + 行号,而是编号
【d + breakpoints】 —— 删除所有的断点
6. 运行 / 调试
【r(run)】 —— F5(无断点直接运行、有断点从第一个断点处开始运行)
- 如果加上断点去运行的话就会在打的断点处停下来。
7.逐过程和逐语句
【n(next)
】 —— 逐过程(相当于F10,为了查找是哪个函数出错了)
【s(step)
】—— 逐语句相当于F11,一次走一条代码,可进入函数,同样的库函数也会进入】
8.跟踪打印
display —— 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】
【 undisplay + 变量名编号
】 —— 取消对先前设置的那些变量的跟踪
9.查看函数调用
【bt
】 —— 看到底层函数调用的过程【函数压栈】
10.指定行号跳转
【until
+ 行号】 —— 进行指定位置跳转,执行完区间代码
11.强制执行函数
finish
—— 在一个函数内部,执行到当前函数返回,然后停下来等待命令
13.跳转到下一断点
c
—— 从一个断点处,直接运行至下一个断点处【VS下不断按F5】