当前位置: 首页 > 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.dtcms.com/a/329512.html

相关文章:

  • Windows也能用!Claude Code硬核指南
  • 2021 年全国硕士研究生招生考试真题笔记
  • 基于DDPG的车辆纵向速度控制优化:兼顾速度与乘坐舒适性
  • React UI 框架
  • Vue3 使用 echarts 甘特图(GanttChart)
  • 【(一)页面布局】
  • 海康视觉平台VM创建项目
  • JAVA实战小项目——输入验证码
  • rtmp 推流
  • 浅层神经网络
  • Dimensional Analysis量纲分析入门
  • 猫粮哪个牌子质量好性价比高?2025适合幼猫的猫粮推荐
  • LangGraph 指南篇-基础控制
  • GaussDB 动态内存过高处理办法
  • 从表单校验到API网关:全链路输入安全防护指南
  • SeaTunnel MCP Server 入选《中国信通院开源商业产品及企业典型案例集(2025)》
  • 开源日志log4cplus—如何将 string类型转为tstring类型,又如何将char*类型转换为tstring类型?
  • 机器学习入门:核心概念详解与Python示例代码
  • 飞算JavaAI的“盾牌”计划:手撕Spring Security + JWT认证链
  • 【debian系统】cuda13和cudnn9.12详细安装步骤
  • 常用机器学习公开数据集大全
  • Spring、Spring MVC、Spring Boot与Spring Cloud的扩展点全面梳理
  • model层实现:
  • 设计模式笔记_行为型_策略模式
  • 【前端Vue】使用ElementUI实现表单中可选择可编辑的下拉框
  • 用 Qt C++ 从零打通“前端界面 → 后端接口”的数据交互
  • 为什么 sim(3) 中的尺度 s 与旋转 R 相乘,而不是平移 t?
  • Go语言实战案例:使用Gin处理路由参数和查询参数
  • 商品分类拖拽排序设计
  • Vue 3 快速入门 第七章