📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 
文章目录
-
- 1. 前言
- 2.关于gdb
-
- 2.1 快速认识gdb
- 2.2 安装cgdb
- 2.3 gdb命令
- 2.4 调试 & 断点
- 3.常见技巧
-
- 3.1 watch
- 3.2 set var确定问题原因
- 3.3 条件断点
1. 前言
软件发布的模式有两种,一种是debug模式,另一种是release模式,一般程序员写软件都是在debug模式下的,如果软件写好,并且自测也通过的话发布软件是在release模式下发布的。比如我们手机应用,电脑应用的发布模式都是release模式。程序员写完一个软件的代码,交给测试员测试都是把release版本交给测试的,测试通过就会发布给用户去使用。但Liunx下编写好的代码无法直接测试,因为gcc/g++默认的模式是release模式。

上面是没有加-g选项的,下面是加了的,我们会发现下面的可执行程序的体积大于上面的,下面的就是debug版本 所以-g选项,让最后形成的可执行程序添加调试信息—debug模式!程序要调试,必须是debug模式!2.关于gdb
2.1 快速认识gdb
quit+回车就退出来了2.2 安装cgdb
cgdb和gdb本质上是一摸一样的,只不过cgdb能够把我们的代码动态呈现出来
• Ubuntu:sudo apt–get install –y cgdb
• Centos:sudo yum install –y cgdb
cgdb的上面是我们的代码,下面是我们的调试信息📌:cgdb分屏操作Esc进入代码屏,i回到gdb屏
l mycode.c:1:从第一行开始显示
2.3 gdb命令
以上是一些常用命令,我将gdb的命令整理成表格,如下所示:
| list/l | 显示源代码,从上次位置开始,每次列出10行 | list/l 10 |
| list/l 函数名 | 列出指定函数的源代码 | list/l main |
| list/l 文件名:行号 | 列出指定文件的源代码 | list/l mycmd.c:1 |
| r/run | 从程序开始连续执行 | run |
| n/next | 单步执行,不进入函数内部 | next |
| s/step | 单步执行,进入函数内部 | step |
| break/b [文件名:]行号 | 在指定行号设置断点 | break 10break test.c:10 |
| break/b 函数名 | 在函数开头设置断点 | break main |
| info break/b | 查看当前所有断点的信息 | info break |
| finish | 执行到当前函数返回,然后停止 | finish |
| print/p 表达式 | 打印表达式的值 | print start+end |
| p 变量 | 打印指定变量的值 | p x |
| set var 变量=值 | 修改变量的值 | set var i=10 |
| continue/c | 从当前位置开始连续执行程序 | continue |
| delete/d breakpoints | 删除所有断点 | delete breakpoints |
| delete/d breakpoints n | 删除序号为n的断点 | delete breakpoints 1 |
| disable breakpoints | 禁用所有断点 | disable breakpoints |
| enable breakpoints | 启用所有断点 | enable breakpoints |
| info/i breakpoints | 查看当前设置的断点列表 | info breakpoints |
| display 变量名 | 跟踪显示指定变量的值(每次停止时) | display x |
| undisplay 编号 | 取消对指定编号变量的跟踪显示 | undisplay 1 |
| until X行号 | 执行到指定行号 | until 20 |
| backtrace/bt | 查看当前执行栈的各级函数调用及参数 | backtrace |
| info/i locals | 查看当前栈帧的局部变量值 | info locals |
| quit | 退出GDB调试器 | quit |
2.4 调试 & 断点
调试的本质是什么?
断点的本质:把代码进行块级别划分,以块为单位,快速定位出现问题的区域
3.常见技巧
3.1 watch
如果我们想要监视某个变量,并且我们十分关心这个变量的变化,我们就可以用watch,它可以新老对比,我们就直接可以看到它的变化了。



📌注意:
- 果你有一些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你.
3.2 set var确定问题原因
set var也是我们比较常用的调试技巧,它可以确定并直接更改我们代码中的错误,而不需要去源代码中去改,。

3.3 条件断点

给已经存在的3号断点加上触发条件👍 如果对你有帮助,欢迎:
- 点赞 ⭐️
- 收藏 📌
- 关注 🔔




