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的一些常用命令:
| 序号 | 命令 | 简写 | 功能 | 示例及说明 |
| 1 | run | r | 运行 | 运行程序 |
| 2 | continue | c | 继续 | c 2表示继续2次,只写c表示继续1次 |
| 3 | break | b | 设置断点 | b main表示在main函数下断点 b *0x1234表示在内存0x1234下断点 info break(简写为i b):查看断点 |
| 4 | delete | d | 删除断点 | delete 断点编号 |
| 5 | disable | disable | 禁用断点 | disable 断点编号 |
| 6 | info | i | 查看信息 | info args:查看当前函数的参数及其值 info line:查看源代码在内存中地址,可以跟行号、函数名 info locals:显示当前函数的局部变量 info symbol:显示全局变量信息 info function:显示所有函数名称 info thread:查看线程信息 info registers(简写为info r):列举寄存器值 i proc map:打印当前进程map信息 |
| 7 | backtrace | bt | 查看栈帧 | bt 2表示显示开头N个栈帧, bt -2最后2个栈帧 |
| 8 | x | x | 显示内存 | x/32xb $esp 以16进制数据显示$esp寄存器指向的数据 x/32i $pc 以汇编显示当前运行地址的数据 x /16s 0x86468700 以字符串形式显示指定地址处的数据 |
| 9 | p | 打印变量 | p argc:打印变量 p/x malloc(1024):申请内存 p/x memcpy(0x1000, 0x2000, 10):将0x2000内存地址的数据拷贝10个字节到0x1000内存地址 | |
| 10 | set | set | 改变变量值 | set $v0 = 0x004000000 set *(unsigned int*)0x8048a54=0x55aa55aa |
| 11 | next | n | 执行下一行 | 单步步过,执行到下一行,不管下一行多复杂 |
| 12 | step | s | 执行下一行 | 单步步入,若下一行为函数,则进入函数内部 |
数据格式
| 序号 | 格式 | 说明 |
| 1 | x | 显示为16进制 |
| 2 | d | 显示为10进制 |
| 3 | u | 显示为无符号10进制 |
| 4 | o | 显示为8进制 |
| 5 | t | 显示为2进制数,t表示two |
| 6 | a | 地址 |
| 7 | c | 显示为字符 |
| 8 | f | 浮点小数 |
| 9 | s | 显示为字符串 |
| 10 | i | 显示为汇编 |
其它用法
| 序号 | 命令 | 说明 |
| 1 | info line *0x00123456 | 查看某个地址意义,会打印出这个函数名 |
| 2 | set height 0 | 去掉less的功能,一次性打印所有 |
| 3 | thread apply all bt | 打印所有线程堆栈 |
| 4 | set print pretty on | 以美观格式打印 |
| 5 | ptype val | 查看结构体定义 |
| 6 | dump memory 1.txt 0x1000 0x2000 | 将0x1000-0x2000内存数据写到文件1.txt |
| 7 | disassemble /m | 反汇编 |
| 8 | set follow-fork-mode child | 调试子进程 |
| 9 | set 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