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

【Linux】ghb工具

GDB简介

GDB(GNU Debugger)是Linux系统中最强大的命令行调试工具,由GNU项目开发。作为程序员调试C/C++程序的利器,GDB能帮助你:

  • 定位程序崩溃原因

  • 分析程序运行状态

  • 跟踪变量值变化

  • 检测内存错误

安装与配置

安装方法

# Ubuntu/Debian
sudo apt install gdb# CentOS/RHEL
sudo yum install gdb# Arch Linux
sudo pacman -S gdb

编译选项

要使用GDB调试,编译时需添加-g选项:

gcc -g program.c -o program

基础调试命令

1. 启动调试

gdb ./program       # 启动调试
gdb --args ./program arg1 arg2  # 带参数启动

2. 常用命令速查表

命令功能说明示例
break设置断点break main
run运行程序run arg1 arg2
next单步执行(不进入函数)next
step单步执行(进入函数)step
print打印变量值print variable
backtrace查看调用栈backtrace
continue继续运行到下一个断点continue
quit退出GDBquit

3. 断点管理

break function_name  # 在函数入口设断点
break file.c:20      # 在指定文件的第20行设断点
info breakpoints     # 查看所有断点
delete breakpoint 2  # 删除2号断点

高级调试技巧

1. 观察点(Watchpoint)

watch variable       # 当变量值改变时暂停
rwatch variable      # 当变量被读取时暂停
awatch variable      # 当变量被读/写时暂停

2. 条件断点

break 20 if i==5     # 当i等于5时在第20行暂停

3. 多线程调试

info threads        # 查看所有线程
thread 2            # 切换到2号线程

4. 内存检查

x/10x &array        # 以16进制查看数组前10个元素
x/20s pointer       # 查看指针指向的字符串(20字节)

实战调试示例

1. 段错误调试

# 编译
gcc -g segfault.c -o segfault# 调试
gdb ./segfault
(gdb) run
# 程序崩溃后
(gdb) backtrace
(gdb) frame 2       # 切换到调用栈第2层
(gdb) print *pointer

2. 死锁检测

(gdb) info threads     # 查看线程状态
(gdb) thread apply all backtrace  # 获取所有线程调用栈

常见问题解决

  1. "No symbol table"错误

    • 确保编译时加了-g选项

    • 检查是否strip过可执行文件

  2. 调试优化过的代码

    gcc -O1 -g program.c -o program
    gdb ./program
    (gdb) set print pretty on

  3. 远程调试

    # 目标机器
    gdbserver :1234 ./program# 开发机器
    gdb
    (gdb) target remote target_ip:1234

结语

GDB是Linux开发者不可或缺的调试利器,从简单的程序崩溃分析到复杂的多线程问题定位,GDB都能提供强大的支持。掌握GDB不仅可以提高调试效率,更能帮助你深入理解程序运行机制。建议从基础命令开始练习,逐步掌握高级功能,最终结合各种插件打造个性化的调试环境。

http://www.lryc.cn/news/575941.html

相关文章:

  • 论文研读2-3:多GNSS双历元纯相位定位-定位精度分析
  • 【docker】docker run参数说明
  • 便利的隐形代价?智能设备正在“偷听”你的生活——物联网时代的隐私深度危机
  • 系统学习 Android 的 进程管理、内存管理、音频管理
  • Qt 与 Halcon 联合开发六:基于海康SDK设计完整的相机类【附源码】
  • 云计算与人工智能的融合:从弹性算力到智能云的IT新革命
  • 报道称CoreWeave洽谈收购Core Scientific,后者涨超30%
  • 内测开启!看海量化回测系统V2.0版本更新,基于miniQMT的回测系统问世!
  • Android 根据包名查看已安装应用的签名
  • 分布式session解决方案
  • 【Docker】解决:构建(docker build)或重新运行容器时,丢失apt-get update问题
  • 第三十一章 MCO——PA8从主频分频输出
  • 【数据挖掘】关联规则算法学习—Apriori
  • Gitee 持续集成与交付(CI/CD)篇
  • Solidity学习 - 断言失败
  • Java:链接mysql数据库报错:CommunicationsException: Communications link failure
  • MySQL Limit数量不满足时导致查询变慢
  • 深圳中青宝互动网络股份有限公司游戏运维工程师面试题(笔
  • 使用OpenCV进行3D重建:详细指南
  • OpenCV图像添加水印
  • word中如何保存高清图片,并保存为高质量的pdf文件(图像不失真)
  • 51c~嵌入式~PLC~西门子~合集1
  • GO 语言学习 之 语句块
  • 汉中农业服务——激活田野的希望,共绘乡村振兴图
  • Guava Cache 本地项目缓存
  • 昇腾910(NPU)安装paddlepaddle【自用版】
  • LinuxBridge的作用与发展历程:从基础桥接到云原生网络基石
  • 【Linux指南】压缩、网络传输与系统工具
  • 用 pnpm + TurboRepo,构建多项目高效开发体系
  • 人工智能-基础篇-4-人工智能AI、机器学习ML和深度学习DL之间的关系