当前位置: 首页 > news >正文

gdb基础操作

GDB(GNU Debugger)是Linux下最常用的程序调试工具,打断点(Breakpoint)是调试中最核心的操作之一。下面我会通过完整的示例,从编写测试代码到使用不同方式打断点,一步步教你如何操作。

第一步:准备测试代码

首先编写一个简单的C语言程序test.c,用于演示断点调试:

#include <stdio.h> // 测试函数 int add(int a, int b) { int sum = a + b; // 行断点测试 return sum; } int main() { int x = 10, y = 20; int result = add(x, y); // 函数调用断点测试 printf("Result: %d\n", result); // 条件断点测试 return 0; }

第二步:编译代码(带调试信息)

编译时必须加上-g参数,保留调试信息,否则GDB无法识别行号、函数名等:

gcc -g test.c -o test

第三步:GDB打断点的核心示例

启动GDB调试程序:

gdb ./test

进入GDB交互界面后,以下是最常用的断点设置方式:

1. 按行号打断点(最常用)

语法:break [文件名:]行号

# 给test.c的第7行(add函数内sum赋值行)打断点 (gdb) break test.c:7 # 简写:b test.c:7

输出示例:Breakpoint 1 at 0x1149: file test.c, line 7.(表示断点1已创建)

2. 按函数名打断点

语法:break 函数名

# 给add函数的入口打断点 (gdb) break add # 简写:b add

输出示例:Breakpoint 2 at 0x1136: file test.c, line 6.

3. 条件断点(满足条件才触发)

语法:break [位置] if 条件

# 给printf行(第14行)打断点,仅当result>25时触发 (gdb) break test.c:14 if result>25 # 简写:b test.c:14 if result>25

输出示例:Breakpoint 3 at 0x1172: file test.c, line 14.

4. 查看已设置的断点
(gdb) info breakpoints # 简写:info b

输出示例:

Num Type Disp Enb Address What 1 breakpoint keep y 0x0000555555555149 in add at test.c:7 2 breakpoint keep y 0x0000555555555136 in add at test.c:6 3 breakpoint keep y 0x0000555555555172 in main at test.c:14 stop only if result>25
5. 运行程序触发断点

(gdb) run # 简写:r

程序会运行到第一个断点处暂停,输出示例:

Starting program: /home/user/test Breakpoint 2, add (a=10, b=20) at test.c:6 6 int add(int a, int b) {
6. 断点的常用操作
# 继续运行到下一个断点 (gdb) continue # 简写:c # 单步执行(不进入函数) (gdb) next # 简写:n # 单步执行(进入函数) (gdb) step # 简写:s # 删除指定断点(如删除断点1) (gdb) delete 1 # 简写:d 1 # 禁用断点(如禁用断点3,不删除仅暂时失效) (gdb) disable 3 # 启用断点 (gdb) enable 3 # 清除某一行的所有断点 (gdb) clear test.c:7

第四步:完整调试流程示例

# 启动GDB gdb ./test # 设置断点 (gdb) b add # 函数断点 (gdb) b test.c:14 if result>25 # 条件断点 # 运行程序 (gdb) r # 程序停在add函数入口,查看变量 (gdb) print a # 简写:p a → 输出:$1 = 10 (gdb) print b # → $2 = 20 # 单步执行 (gdb) n # 执行到sum = a + b行 (gdb) p sum # → $3 = 30(此时sum已赋值) # 继续运行 (gdb) c # 运行到printf行,因result=30>25触发断点 (gdb) p result # → $4 = 30 # 继续运行到程序结束 (gdb) c # 输出:Result: 30 # 程序正常退出 # 退出GDB (gdb) quit # 简写:q

总结

  1. 编译前提:必须用-g参数编译代码,保留调试信息,否则GDB无法识别行号/函数名。

  2. 核心断点命令

    1. 行断点:b 文件名:行号

    2. 函数断点:b 函数名

    3. 条件断点:b 位置 if 条件

  3. 常用调试命令run(运行)、continue(继续)、next/step(单步)、print(查看变量)、info b(查看断点)。

通过这些断点设置方式,你可以精准控制程序的暂停位置,逐步排查代码中的问题。

http://www.jsqmd.com/news/472861/

相关文章:

  • 基于自适应PI的构网型变流器预同步控制策略复现报告
  • 实验室纯水机怎么选?2026 纯水系统品牌及选型全攻略
  • Claude Code Task 系统:任务管理与进度追踪
  • 液压挖掘机主机厂整机CAD图纸
  • 膜结构车棚性价比排名深度解析
  • 【01】Openclaw 的安装及配置
  • Python自动化实现思路
  • 【Mac】如何开启 Chrome Gemini 侧边栏?
  • MATLAB环境下一种基于小波散射网络的纹理图像分类方法与基于小波散射变换和深度学习的寄生虫感...
  • DeepSeek大模型选择,一文告诉你该选用那个模型
  • WorkBuddy(Claw)原型设计之Axhub实战篇
  • SGP.22 eSIM通信原理-打电话
  • CGAL ::Surface Mesh 参考文档examples详解
  • 【大白话】视频文件这么小,画质却还这么好?一次搞懂编码(H.264/H.265)与封装(MP4/MKV)的“爱恨情仇”
  • map的[]运算符,这个看似方便的语法,藏着怎样的魔鬼?
  • 洛谷P8218 【深进1.例1】求区间和 考点:一维前缀和
  • 双有源桥式DC-DC变换器仿真及Matlab建模实践:自行设定输入输出电压值与基础讲解
  • K8s Service
  • 供应链产研交付提效:后端开发提效实战
  • S款直流一体机模块问题排查指导
  • effective-Objective-C-大中枢派发
  • “十五五”具身智能新基建:虚实融合训练场与Agent协同控制平台深度解析(WORD)
  • 期货软件开发「启动加载页 / 初始化窗口」
  • Python抓取广东省各城市租房数据并存储
  • 【研报216】2026年智能驾驶产业市场趋势与用户需求分析:AI 重构汽车价值链
  • 基于springboot城市智慧养犬管理平台
  • 4-Kotlin核心语法-数据类与密封类
  • 为什么防御 DDoS 攻击的成本这么高?
  • 基于AWS CAF构建标准化云治理体系,助力企业实现安全合规与可持续优化
  • CTF保姆级教程:从零基础到参赛拿奖,2026年最全指南!