[GDB] gdb实用命令

news/2025/10/29 11:40:36/文章来源:https://www.cnblogs.com/migrator/p/19173904
[GDB] gdb实用命令

ChatGPT生成(2025年10月29日11:31:17)

GDB 实用命令与调试入门指南

目录
  • GDB 实用命令与调试入门指南
    • 一、GDB 是什么
    • 二、启动 GDB
    • 三、常用命令总览(速查表)
    • 四、断点控制(Breakpoints)
      • 设置断点
      • 查看 / 删除断点
      • 条件断点
    • 五、单步调试与执行控制
    • 六、查看变量与内存
      • 查看变量
      • 监视变量变化
      • 查看内存
    • 七、调试崩溃程序(core dump)
      • 启用 core dump
      • 运行程序并崩溃后
      • 分析
    • 八、GDB 实战案例
      • 示例:定位数组越界
    • 九、图形化前端推荐


一、GDB 是什么

GDB(GNU Debugger) 是 GNU 项目下的调试器,用于调试 C/C++、Go、Rust 等语言的程序。
它可以让你:

  • 在程序运行时暂停(设置断点)
  • 逐行查看执行过程
  • 观察变量值的变化
  • 调试段错误(segmentation fault)
  • 调试多线程、core dump、远程目标程序等

二、启动 GDB

启动方式 说明
gdb ./main 启动 GDB 并加载可执行文件
gdb ./main core 调试 core dump 文件
gdb -p <pid> 附加到正在运行的进程
gdb --args ./main arg1 arg2 带参数启动
run 在 GDB 中运行程序
quit 退出 GDB

三、常用命令总览(速查表)

命令 说明
list / l 查看源代码
break / b 设置断点
delete / d 删除断点
run / r 运行程序
continue / c 继续运行
next / n 单步执行(不进入函数)
step / s 单步执行(进入函数)
finish 运行到当前函数结束
print / p 打印变量值
info locals 查看当前局部变量
backtrace / bt 查看调用栈
frame n 切换到第 n 帧
watch <var> 监视变量变化
info threads 查看线程
thread <id> 切换线程
info registers 打印返回值(查看寄存器信息)
set logging on 输出日志到文件
symbol-file <file> 加载符号文件
quit / q 退出调试器
.gdbinit 文件 自动脚本执行(在该文件中写入常用命令)

四、断点控制(Breakpoints)

设置断点

b main               # 在 main 函数处断点
b 25                 # 在第 25 行设置断点
b file.c:10          # 在 file.c 第 10 行设置断点
b func_name          # 在指定函数入口设置断点

查看 / 删除断点

info breakpoints     # 查看所有断点
delete 1             # 删除编号 1 的断点
disable 2            # 暂时禁用断点 2
enable 2             # 重新启用断点

条件断点

break foo if x > 10

程序运行到 foo() 并且 x > 10 时才会暂停。


五、单步调试与执行控制

命令 说明
n / next 执行下一行,不进入函数
s / step 执行下一行,进入函数
finish 执行到当前函数返回
c / continue 继续运行直到下一个断点
until <行号> 运行到指定行停止
return 立即从当前函数返回
run 从头重新执行程序

六、查看变量与内存

查看变量

print x
p x+5
p *ptr
p my_struct.member

监视变量变化

watch count
info watchpoints

查看内存

x/10x addr       # 查看地址 addr 开始的10个十六进制字
x/4f &array      # 查看数组浮点内容
x/s ptr          # 打印字符串

七、调试崩溃程序(core dump)

当程序崩溃时(Segmentation fault),系统可生成一个 core 文件。
通过它你可以查看当时的函数调用栈和变量状态。

启用 core dump

ulimit -c unlimited

运行程序并崩溃后

gdb ./main core

分析

bt           # 查看调用栈
frame 2      # 切换到栈帧2
info locals  # 查看局部变量

八、GDB 实战案例

示例:定位数组越界

#include <stdio.h>int main() {int a[3] = {1, 2, 3};for (int i = 0; i <= 3; i++) { // BUG: 越界printf("%d\n", a[i]);}return 0;
}

调试步骤:

gcc -g test.c -o test
gdb ./test
(gdb) run
(gdb) bt
(gdb) frame 0
(gdb) list
(gdb) print i

输出:

Program received signal SIGSEGV, Segmentation fault.
#0  main () at test.c:5
5           printf("%d\n", a[i]);
(gdb) print i
$1 = 3

✅ 定位到 i=3 时访问了 a[3] 越界。


九、图形化前端推荐

工具 说明
VS Code + C/C++ Extension 最常用、直观、跨平台
DDD (Data Display Debugger) 经典 GTK 界面 GDB 前端
gdbgui Web 界面调试器 (pip install gdbgui)
Eclipse CDT / CLion IDE 集成调试器,功能强大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PalmPay 携手阿里云 RocketMQ,共建非洲普惠金融“高速通道”

借助云消息队列 RocketMQ 版的高性能、低延迟和灵活扩展能力,PalmPay 实现了支付业务的异步化、解耦化与智能化升级,不仅优化了用户体验,也显著提升了系统运维效率和业务响应能力。作者:横槊、建源、文婷、稚柳 Pa…

2025年螺旋输送机批发厂家权威推荐:带式输送机生产厂家精选

螺旋输送机凭借其结构简单、密封性好、操作方便等特点,在化工、建材、粮食、冶金等行业中得到广泛应用。近年来,随着各行业对输送效率、环保要求和空间利用率要求的提高,螺旋输送机技术也在不断升级创新。 本次评选…

2025年标识标牌源头厂家排行榜

2025年标识标牌源头厂家排行榜 文章摘要 2025年标识标牌行业预计将迎来数字化和定制化浪潮,市场规模持续扩大,企业对源头厂家的需求更加注重全流程服务和质量保障。本文基于行业数据和用户评价,整理出2025年标识标牌…

使用 .NET Core。如果目标进程未运行 .NET Core,则发生这种情况并不意外。

当您在使用 .NET Core 开发应用程序时,如果目标进程尚未安装 .NET Core 运行时,确实可能会遇到一些问题,尤其是在尝试运行或调用依赖于 .NET Core 的程序时。以下是一些解决和应对这种情况的策略: 1. 检查并安装 .…

jmeter 创建100个现场组,每个线程组里面有1个http请求,http接口内容为读取CSV文件

View Postjmeter 创建100个现场组,每个线程组里面有1个http请求,http接口内容为读取CSV文件思路:先读取csv文件,将数据放到list数组里;再创建线程组和接口并填写数据import org.apache.jmeter.control.LoopContro…

Java Stream API:现代集合处理与函数式编程

Java 8引入的Stream API彻底改变了我们处理集合数据的方式,将函数式编程范式优雅地融入Java语言中。Stream提供了一种高效、声明式的数据操作方式,让代码更加简洁易读。 与传统的迭代方式不同,Stream操作分为中间操…

2025 年 5 吨电子地磅,18 米电子地磅,无人值守电子地磅厂家最新推荐,产能、专利、环保三维数据透视

引言 在工业称重领域,5 吨电子地磅、18 米电子地磅及无人值守电子地磅的性能与品质,直接关系到企业生产运营效率与成本控制。为精准筛选优质厂家,本次推荐结合衡器协会最新测评数据,从产能、专利、环保三维度构建测…

C 程序的内存分区结构

🧩 C 程序的内存分区结构 一个典型的 C 程序在运行时,内存大致分为以下几个区域:区域 内容 特点代码区 (Text Segment) 程序的机器指令 只读全局/静态区 (Data Segment) 已初始化的全局变量和静态变量 程序运行期间…

2025年手持式光谱仪厂家权威推荐榜:XRF/LIBS手持式、便携式X射线荧光、土壤测铝、合金分析仪专业测评

2025年手持式光谱仪厂家权威推荐榜:XRF/LIBS手持式、便携式X射线荧光、土壤测铝、合金分析仪专业测评 行业技术发展现状 手持式光谱分析技术作为现代工业检测领域的重要突破,正在经历快速的技术革新和产业升级。随着…

2025 年功率分析仪记录仪,携功率分析仪,电池功率分析仪,光伏功率分析仪厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读

在工业自动化与新能源产业高速发展的当下,功率分析仪记录仪、便携功率分析仪、电池功率分析仪及光伏功率分析仪已成为关键测试设备,其性能直接关乎行业生产研发质量。为帮助企业精准选型,仪器仪表行业协会联合第三方…

2025年工业清洗剂厂家权威推荐榜:水洗/水基/碳氢/铝材/超声波/金属/真空/除油/防锈清洗剂源头厂家精选

2025年工业清洗剂厂家权威推荐榜:水洗/水基/碳氢/铝材/超声波/金属/真空/除油/防锈清洗剂源头厂家精选 随着制造业向高质量方向发展,工业清洗剂作为生产过程中不可或缺的辅助材料,其技术标准与环保要求日益提升。在…

jmeter读取csv文件放到list数组里面

View Postjmeter读取csv文件放到list数组里面方法一:使用Java NIOimport java.nio.file.Files import java.nio.file.Paths import java.util.stream.Collectorstry {def filePath = Paths.get("C:/Users/yxchun/…

Spring @Bean注解用法

目录1. 基础逻辑:按类型匹配(byType)2. 多个子类Bean的情况:类型冲突与解决方式1:使用@Primary指定优先Bean方式2:使用@Qualifier指定Bean名称总结 在Spring框架中,当一个@Bean方法的入参需要注入依赖时(如你示…

基于MATLAB的视频车流量统计系统实现

1. 系统架构设计2. 核心算法实现 2.1 视频预处理 % 读取视频文件 video = VideoReader(traffic.mp4); vidReader = vision.VideoFileReader(video.Filename);% 转换为灰度图像(降低计算量) grayVideo = vision.Color…

vscode调试时显示张量的维度shape

在程序的入口添加 如下代码即可:import torch def patch_tensor_repr():original_repr = torch.Tensor.__repr__def new_repr(self):shape_str = f"Shape: {tuple(self.shape)}"tensor_str = original_repr…

2025 年大型电子地磅,汽车衡电子地磅,120 吨电子地磅,100 吨电子地磅 厂家最新推荐,产能、专利、环保三维数据透视

引言 为精准筛选 2025 年大型电子地磅(含汽车衡、120 吨及 100 吨电子地磅)优质厂家,衡器协会联合行业权威检测机构开展专项测评。测评以产能、专利、环保为核心维度,结合市场口碑与服务能力综合评估:产能维度核查…

2025年净气活性炭定做厂家权威推荐:除味活性炭工厂/废气净化活性炭源头厂家/空气净化活性炭厂家精选

随着环保政策的持续推进和工业净化需求的不断提升,定制化活性炭市场正迎来新一轮增长,专业生产厂家凭借差异化产品与技术优势占据竞争高地。 净气活性炭作为工业净化、环境治理和水处理领域的核心材料,其定制化市场…

2025年超声波分散设备厂商权威推荐榜单:进口超声波分散设备/本多超声波分散设备/双频超声波分散设备源头厂家精选

超声波分散技术正悄然推动新能源、新材料等领域的产业升级,其设备市场规模预计在2031年达到126.7亿元。 超声波分散设备作为现代工业中颗粒分散和纳米材料制备的关键设备,已广泛应用于新能源电池、石墨烯、化工涂料等…

Element(key):通过控件的 key 属性获取控件对象

在 PySimpleGUI 中,FindElement(key) 或 Element(key) 方法用于通过控件的唯一标识符 key 获取对应的控件对象,以便动态修改其属性(如文本、颜色、可见性等)。以下是具体示例:示例场景 假设有一个窗口,包含以下控…

ubuntu服务器jar包开机60秒后自启

1、创建start_all.sh文件nohup java -jar /opt/sxygsj/jar/dp-system.jar > /opt/sxygsj/jar/dp-system.log 2>&1 & echo "dp-system.jar 启动中,日志:/opt/sxygsj/jar/dp-system.log"nohup…