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

GDB命令笔记

冷若冰霜驱动盘

list

run

break

step    next (n) # 单步执行(不进入函数)

quit

delete

print

continue (c) # 继续运行到下一个断点

watch x # 当变量x被修改时暂停

GDB(GNU Debugger)是Linux下最强大的代码调试工具,掌握其常用命令能快速定位程序崩溃、死锁、逻辑错误等问题。以下是按使用场景分类的GDB核心命令详解(附实例):


一、基础调试流程

1. 启动调试

bash

gdb ./your_program       # 加载可执行文件
gdb -p <pid>             # 附加到正在运行的进程
2. 设置断点

bash

b main                   # 在main函数入口设断点
b file.c:20              # 在file.c第20行设断点
b *0x4005a7              # 在内存地址0x4005a7设断点
b ClassA::func           # 在类成员函数func设断点
3. 运行程序

bash

run                      # 从头运行程序
run arg1 arg2            # 带参数运行
continue (c)             # 继续运行到下一个断点
4. 单步执行

bash

next (n)                 # 单步执行(不进入函数)
step (s)                 # 单步执行(进入函数内部)
finish                   # 执行完当前函数并暂停

二、查看程序状态

1. 查看变量/内存

bash

print x                  # 打印变量x的值
print *ptr@10            # 打印ptr指向的10个元素
print $rax               # 打印寄存器rax的值
x/8wx 0x7fffffffe010     # 以16进制显示内存地址处的8个字(4字节)
2. 查看堆栈

bash

backtrace (bt)           # 显示当前调用栈
frame 2                  # 切换到调用栈第2层
info locals              # 显示当前栈帧的局部变量
3. 监控点(Watchpoints)

bash

watch x                  # 当变量x被修改时暂停
watch *(int*)0x12345678  # 监控内存地址的值变化

三、高级调试技巧

1. 多线程调试

bash

info threads             # 列出所有线程
thread 3                 # 切换到线程3
b thread_test.c:37 thread 2  # 仅在线程2的指定位置断点
2. 条件断点

bash

b file.c:15 if x>100     # 当x>100时触发断点
ignore 1 5               # 忽略断点1的前5次触发
3. 修改程序状态

bash

set var x=42             # 修改变量x的值
call foo()               # 强制调用函数foo()

四、崩溃分析(Core Dump)

bash

gdb ./your_program core  # 加载崩溃转储文件
bt full                  # 显示完整调用栈(含局部变量)
info registers           # 查看崩溃时的寄存器值

五、实用命令速查

命令作用示例
list (l)查看源代码l 10,20(显示10-20行)
info breakpoints查看所有断点
disable/enable禁用/启用断点disable 1-3
disassemble反汇编当前函数disassemble /m main
handle设置信号处理handle SIGSEGV stop print
define自定义命令序列见下方示例

六、实战调试示例

场景:调试段错误(Segmentation Fault)

bash

(gdb) run                # 运行程序直到崩溃
Program received signal SIGSEGV, Segmentation fault.
(gdb) bt                 # 查看崩溃位置
#0  0x000055555555516a in func (ptr=0x0) at test.c:8
#1  0x0000555555555196 in main () at test.c:15
(gdb) frame 0            # 切换到崩溃栈帧
(gdb) print ptr          # 查看空指针
$1 = (int *) 0x0
自定义命令:打印链表

bash

define plistset $p = headwhile $p != 0print *$pset $p = $p->nextend
end
# 使用:plist

七、GDB可视化增强

  • TUI模式gdb -tui 或 Ctrl+X A 切换文本界面(显示源码+汇编)

  • 插件推荐

    • GEF:内存布局可视化、漏洞利用辅助

    • pwndbg:CTF/PWN专用增强


八、调试技巧总结

  1. 崩溃分析:优先用 bt + info registers 定位异常位置

  2. 数据断点:用 watch 捕捉变量意外修改

  3. 多线程调试:用 thread apply all bt 打印所有线程堆栈

  4. 自动化:用 .gdbinit 文件预加载命令(如自定义函数)

⚠️ 注意:编译时务必加 -g 选项保留调试符号(gcc -g -o test test.c

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

相关文章:

  • 【React】use-immer vs 原生 Hook:谁更胜一筹?
  • Chrome 插件开发实战
  • AutoCAD 各版本与插件合集详解:Architecture、Plant 3D、Civil 3D 等
  • CNN卷积神经网络预测手写数字的Pytorch实现
  • games101 第三讲 Transformation(变换)
  • 人工到智能:塑料袋拆垛的自动化革命 —— 迁移科技的实践与创新
  • AI一键抠图软件--Digiarty.AIArty.Image.Matting
  • MySQL数据库知识体系总结 20250813
  • 数据库连接池如何进行空闲管理
  • TeamViewer 以数字化之力,赋能零售企业效率与客户体验双提升
  • “我店模式”:零售转型中的场景化突围
  • 【k8s】k8s pod调度失败原因列表、Pod 完整的状态类型列表
  • TDengine IDMP 基本功能(4. 实时分析)
  • 【金仓数据库产品体验官】_从实践看金仓数据库与 MySQL 的兼容性
  • Java开发主流框架搭配详解及学习路线指南
  • Pytest项目_day14(参数化、数据驱动)
  • VR中image或者文字一直浮现在眼前
  • Flutter 多模块 + 组件化架构设计实践
  • 使用HtmlAgilityPack+PuppeteerSharp+iText7抓取Selenium帮助文档
  • PCIE 配置空间 拓展能力 定义
  • mac环境下安装git并配置密钥等
  • 20250813测试开发岗(凉)面
  • 19. 重载的方法能否根据返回值类型进行区分
  • 完整源码+技术文档!基于Hadoop+Spark的鲍鱼生理特征大数据分析系统免费分享
  • Java Spring框架最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
  • 【C#】利用数组实现大数数据结构
  • 云电竞盒子对游戏性能有影响吗?
  • 《Python学习之基础语法1:从零开始的编程之旅》
  • 向量相似度计算与Softmax概率分布对比
  • 2025盛夏AI热浪:八大技术浪潮重构数字未来