《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 变量修改
相关推荐
maosheng11466 小时前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken7 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.2917 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C7 小时前
CPU Cache
linux·cache
Hoshino.418 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
恒创科技HK9 小时前
通用型云服务器与计算型云服务器:您真正需要哪些配置?
运维·服务器
吴佳浩 Alben9 小时前
GPU 生产环境实践:硬件拓扑、显存管理与完整运维体系
运维·人工智能·pytorch·语言模型·transformer·vllm
播播资源10 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry10 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
学不完的10 小时前
Docker数据卷管理及优化
运维·docker·容器·eureka