GDB命令笔记

发布于:2025-08-14 ⋅ 阅读:(19) ⋅ 点赞:(0)

冷若冰霜驱动盘

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 plist
  set $p = head
  while $p != 0
    print *$p
    set $p = $p->next
  end
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


网站公告

今日签到

点亮在社区的每一天
去签到