《Gdb 调试实战指南:不同风格于VS下的一种调试模式》

**前引:**在 Linux 开发的世界里,每一位程序员都曾与 "隐藏极深的 bug" 正面交锋:明明逻辑看似无懈可击,程序却频繁崩溃;运行结果与预期南辕北辙,却找不到任何语法错误;甚至进程突然挂起,日志里只留下一行模糊的报错...... 此时,你需要的不是反复打印日志的 "笨办法",而是一款能直抵问题核心的调试利器 ------Gdb!

目录

【一】Gdb介绍

【二】Gdb安装

【三】Gdb调试使用

(1)创建目标文件

(2)进入退出调试模式

(3)查看代码

(4)设置断点

(5)查看/删除断点

(6)启动程序

(7)控制程序运行

(8)监视变量

(9)修改变量


【一】Gdb介绍

可理解为Gdb是Linux下的代码调试工具 ,专为编译型语言(如 C、C++、Go、Fortran 等)设计,是 Linux/Unix 环境下程序调试!程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程 序,默认release 模式!要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候,加上 -g 选项,如果没有添加,程序⽆法被编译,例如:

cpp 复制代码
//Release版本
gcc mycmd.c -o mycmd

//DeBug版本
gcc mycmd.c -o mycmd -g

【二】Gdb安装

Centos执行下面指令即可:

cpp 复制代码
sudo yum install gdb -y

【三】Gdb调试使用

(1)创建目标文件

首先我们建一个源文件,以.c为例:

然后我们编译一下得到可执行程序,记住需要加**-g** 进入Debug模式!

(2)进入退出调试模式

我们输入下面指令进入调试模式:

cpp 复制代码
gdb text(可执行程序)

如果我们要退出,输入 q即可

(3)查看代码
指令 作用 示例
list(或l 显示当前位置开始的 10 行代码 (gdb) l
list 行号 显示指定行号附近的代码 (gdb) l 5(显示第 5 行附近)
list 函数名 显示指定函数的代码 (gdb) l sum(显示 sum 函数)
list 文件名:行号 多文件时指定文件查看 (gdb) l test.c:8

例如:

(4)设置断点

设置断点之后程序运行到断点之后就会停下来,可以查看快速查看接下来的程序状态

指令格式 作用 示例
b 行号 在当前文件的指定行设断点 (gdb) b 8(第 8 行设断点)
b 函数名 在函数入口设断点 (gdb) b sum(sum 函数入口)
b 文件名:行号 多文件时指定文件的行号 (gdb) b test.c:15

条件断点:(注意 if 单独前后空格,具体条件不分开)

cpp 复制代码
b 行数 条件

(gdb) b 8 if i==3
Breakpoint 2 at 0x11c8: file test.c, line 8.

例如:

(5)查看/删除断点

注意:删除操作的是查看断点之后的编号,而不是行数

指令 作用 示例
info breaki b 查看所有断点(含编号、位置) (gdb) i b
delete 断点编号d 编号 删除指定断点 (gdb) d 2(删除编号 2 的断点)
clear 行号 删除指定行的所有断点 (gdb) clear 8

例如:

(6)启动程序

启动程序,到断点处或者main开始的第一行停下来

指令 作用 适用场景
runr 从程序开头运行,直到断点 / 结束 / 崩溃 需要完整运行程序到断点时
start 从程序开头运行,在 main 函数第一行暂停 想从程序入口开始逐步调试时

例如:

(7)控制程序运行

可以逐语句、过程的控制程序运行

|------------|-----|------------------------|--------------------|
| next | n | 执行 "当前行",遇到函数不进入 | 跳过函数调用,适合看整体流程 |
| step | s | 执行 "当前行",遇到函数会进入 | 进入函数内部,适合查函数内的 bug |
| continue | c | 继续运行,直到下一个断点 / 结束 / 崩溃 | 跳过当前暂停,直接到下一个关键位置 |

例如:

(8)监视变量

这里我们就学一种常见的逐个监视变量内容,其它的可以百度

cpp 复制代码
print 变量

或者

p 变量
(9)修改变量

可以在调试模式下修改变量的值,这个是在VS下无法实现的!

cpp 复制代码
set var 变量修改
相关推荐
Cyber4K1 分钟前
【Nginx专项】基础入门篇:状态页、微更新、内容替换、读取、压缩及防盗链
linux·运维·服务器·nginx·github
shining1 小时前
当拿到一个新服务器时所需准备工作
linux·程序员
门思科技1 小时前
LoRaWAN项目无需NS和平台?一体化网关如何简化部署与成本
服务器·网络·物联网
Bruce_Liuxiaowei1 小时前
顺藤摸瓜:一次从防火墙告警到设备实物的溯源实战
运维·网络·网络协议·安全
maosheng11461 小时前
linux的综合教程(搭建论坛教程)
linux
IpdataCloud2 小时前
效果广告中点击IP与转化IP不一致?用IP查询怎么做归因分析?
运维·服务器·网络
Deitymoon2 小时前
linux——TCPIP协议原理
linux·网络
独小乐2 小时前
018.使用I2C总线EEPROM|千篇笔记实现嵌入式全栈/裸机篇
linux·笔记·单片机·嵌入式硬件·arm·信息与通信
SPC的存折2 小时前
2、Docker命令与镜像、容器管理
linux·运维·服务器·docker·容器·eureka
D4c-lovetrain2 小时前
Linux个人心得26 (redis主从复制全流程,详细版)
linux·运维·服务器