GDB使用小记

GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,GDB除支持c/c++语言外还支持go、D、object-c、fortran等语言。

源码下载链接,可以交叉编译支持多种CPU架构:

http://ftp.gnu.org/gnu/gdb/

GDB主要帮助你完成下面四个方面的功能:

  • 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
  • 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
  • 当程序被停住时,可以检查此时你的程序中所发生的事。
  • 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

本地调试一般是使用gdb,远程调试是gdbserver,通常gdbserver不仅可以和gdb一起调试,还可以和IDA等第三方调试工具一起调试,一般有两种调试方法,命令如下:

# 1088是进程pid,端口1234,任意ip均可访问调试
./gdbserver :1234 --attach 1088
# program是程序名称,端口1234,任意ip均可访问调试
./gdbserver :1234 --attach program

gdbserver使用较为简单,这里就不过多介绍,下面主要介绍一下gdb的一些常用命令:

序号命令简写功能示例及说明
1runr运行运行程序
2continuec继续c 2表示继续2次,只写c表示继续1次
3breakb设置断点b main表示在main函数下断点
b *0x1234表示在内存0x1234下断点
info break(简写为i b):查看断点
4deleted删除断点delete 断点编号
5disabledisable禁用断点disable 断点编号
6infoi查看信息info args:查看当前函数的参数及其值
info line:查看源代码在内存中地址,可以跟行号、函数名
info locals:显示当前函数的局部变量
info symbol:显示全局变量信息
info function:显示所有函数名称
info thread:查看线程信息
info registers(简写为info r):列举寄存器值
i proc map:打印当前进程map信息
7backtracebt查看栈帧bt 2表示显示开头N个栈帧, bt -2最后2个栈帧
8xx显示内存x/32xb $esp 以16进制数据显示$esp寄存器指向的数据
x/32i $pc 以汇编显示当前运行地址的数据
x /16s 0x86468700 以字符串形式显示指定地址处的数据
9printp打印变量p argc:打印变量
p/x malloc(1024):申请内存
p/x memcpy(0x1000, 0x2000, 10):将0x2000内存地址的数据拷贝10个字节到0x1000内存地址
10setset改变变量值set $v0 = 0x004000000
set *(unsigned int*)0x8048a54=0x55aa55aa
11nextn
执行下一行
单步步过,执行到下一行,不管下一行多复杂
12steps执行下一行单步步入,若下一行为函数,则进入函数内部

数据格式

序号格式说明
1x显示为16进制
2d显示为10进制
3u显示为无符号10进制
4o显示为8进制
5t显示为2进制数,t表示two
6a地址
7c显示为字符
8f浮点小数
9s显示为字符串
10i显示为汇编

其它用法

序号命令说明
1info line *0x00123456查看某个地址意义,会打印出这个函数名
2set height 0去掉less的功能,一次性打印所有
3thread apply all bt打印所有线程堆栈
4set print pretty on以美观格式打印
5ptype val查看结构体定义
6dump memory 1.txt 0x1000 0x2000将0x1000-0x2000内存数据写到文件1.txt
7disassemble /m反汇编
8set follow-fork-mode child调试子进程
9set scheduler-locking on调试加锁当前线程,停止所有其他线程

附:

# 开启core文件转储
ulimit -c unlimited
echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
# gdb调试core文件
gdb -c "/tmp/core-filename-pid-timestamp"
# gdb运行的时候同时执行运行并打印proc map内容
gdb filename --eval-command="r" --eval-command="i proc map"

参考链接:

https://baike.baidu.com/item/gdb/10869514?fr=aladdin

https://blog.csdn.net/weixin_37921201/article/details/120117096

https://www.cnblogs.com/lvdongjie/p/8994092.html