一文快速上手GDB调试器

409 阅读2分钟

调试器的原理

  1. 编译程序的时候带上调试信息
// 对于gcc来讲
gcc -g
  1. 调试信息包含:指令地址、对应源代码及行号

  2. 指令完成后,回调调试器来获取CPU寄存器的信息

使用方式

> gdb testsoft

GDB基础命令

CommandSimplifyActionDescription
runr支行程序调试开始,注意在run之前要先设置断点
breakb设置断点b 函数名
infoi查看信息查看断点i b,等后面详细内容
deleted删除断点d 断点编号
disabledisable禁用断点disable 断点编号
backtracebt,where查看栈帧bt N显示开头N个栈帧, bt -N最后N个栈帧
printp打印信息p argc打印变量
xx显示内存x 0xffffffff
setset设置变量的值set variable <变量>=<表达式>;比如 set var test=3
nextn单步执行执行到下一步
steps单步执行/进入函数如果下一行是函数,则进入到函数内
continuec执行到最后c 可以设置执行次数,默认表示1次
finishfinish从当前函数跳出,会执行完当前函数所有逻辑
untiluntil执行完代码块

打印变量值

FormatDescription
xp/x var 显示16进制
dp/d var 显示10进制
up/u var 显示无符号10进制
op/o var 显示8进制
tp/t var 显示2进制
ap/a var 显示地址
cp/c var 显示字符
fp/f var 符点数
sp/s var 显示字符串

查看内存

(gdb) x &a 
0xfffffffffdddd: 0x000000001

(gdb) x 0xfffffffffdddd
0xfffffffffdddd: 0x000000001

自动换行

(gdb) set hight 0

打印所有线程堆栈

(gdb) thread apply all bt

查看某个地址详细信息

这个似乎只针对函数有效

(gdb) info line 0xfffffffddddd

查看结构体定义

(gdb) ptype pTimeVal

美化格式

(gdb) set print pretty on

打印数组

(gdb) p *pStTmp->pst@4

显示信息

// display
(gdb) display var  // 显示变量信息

// info
// info args 查看当前函数参数
// info line 查看源代码在内存中地址,可以跟行号、函数名
// info locals 显示当前函数的局部变量
// info symbol 显示全局变量信息
// info function 显示所有函数名
// info thread 查看线程信息
// info registers 列举寄存器的值

指定动态库位置

(gdb) set solib-search-pathc ./libso/
(gdb) set solib-absolute-prefix ./libso/

打印当前进程map信息

(gdb) i proc map

GDB进阶

多纯程调试

(gdb) set scheduler-locking on
(gdb) set scheduler-locking off

// 锁定某个线程
(gdb) b getTimeOfDay thread 23  // 23表示线程号

反汇编

(gdb) disassemble /m

汇编单步调试

(gdb) nexti
(gdb) stepi

汇编指令偏移

(gdb) b * main + 4