笔者来聊一下对于GDB的一些操作使用认识。
1、GDB的使用以及用途
GDB是GNU的一个项目,具体网站如下,网址:https://www.gnu.org/software/gdb/
- 支持多种语言,常用的就是C/C++/Python等等
- 跨平台使用,Linux/windows/MacOS,当然也可以交叉编译,到其他目标平台上面,
例如:aarch64-linux-gnu-gcc 编译器,是有host x86_64 平台编译出 target是aarch64_linux_gnu的
2、GDB的安装环境
2.3 Linux安装
(1) sudo apt-get install gdb
(2)下载:http://ftp.gnu.org/gnu/gdb/特定版本源码,然后解压,然后编译出可执行文件。
2.4 Windows安装
(1)下载MinGW (SourceCode)https://sourceforge.net/projects/mingw-w64/files/latest/download
Minimalist GNU for windows :一套GNU工具,window下的GNU工作环境
(2)
(3)
- Architecture:
i386/i586/i686:不同时期的CPU/ 32位
x86_84:x(3/4/5/6)86版本 /64位 - Threads:线程采用POSIX还是win32
POSIX:可移植操作系统接口(API)C11标准
WIN32:win32 API接口 - Exception:异常处理模型
seh:新发明、不支持32、性能较好
siji:古老但支持32
(4)环境变量 PATH
(5)测试环境是否OK
3、GDB的调试原理以及方式
3.1 调试原理
GDB的主要调试原理可参考这篇文章:https://mp.weixin.qq.com/s/_GdfCo9PuOK4bROSxiwM_A
-
通过系统调用,Ptrace函数,可以实现主进程和子进程的通信与控制
1、父进程观察和控制子进程的运行(gdb接管运行程序)
2、检查和改变其寄存器等信息
3、建立在信号基础上,用来断点调试和系统跟踪 -
函数参数
1、request 执行的指令 2、pid 跟踪的进程
3、addr 监控的内存地址 4、data 读取或者写入的数据 -
enum __ptrace_request request(建立父子进程关系)
1、 PTRACE_TRACEME
gdb 先fork子进程 ,子进程调用ptrace、运行用户程序 、父子进程通过信号进行交互。
2、 PTRACE_ATTACH:attach pid
使得进程号pid的进程成为gdb的子进程。
3、 PTRACE_CONT
进行运行之前停止的子进程。
3.2 调试方式
三种方式:注意使用的时候,需要增加-g 选项
-
gdb 运行程序,例如:gdb main.exe 或者 gdb --args 0x1 main.exe
-
gdb attach pid,如下图
-
gdb 与 gdb server
宿主机运行:gdb + 可执行文件
连接目标机: target remote 192.168.0.138:6322
目标机器运行:gdbserver ip:端口 + 可可执行文件
具体可以参考这篇文章Eclipse 远程Debug调试C程序
4、GDB的调试指令
-
list指令
用法: list 文件名:行号 或者list 函数
-
break指令
1、b file:行号 在指定文件的行号出设置断点。
2、b file:函数 在文件指定函数的入口处停止
-
delete指令
1、delte 断点号/断点号集合
-
clear指令
1、clear+函数/clear+函数:行号
-
run指令
执行程序,遇到断点会停止、否则一直运行到程序结束
-
continue指令
继续运行程序
-
next指令
单步跳过,输入n指令后,enter建可以一直单步
-
step执行
单步执行
-
Print (格式) 变量名
1、常规类型(int/char/float)
2、结构体类型数值
-
Set 变量名 = 数值
-
watch 变量/表达式
1、数据断点
2、条件断点
高效调试,非常重要
例如:
1、watch test_data_g
2、Watch test_data_g.value1
3、watch test_data_g->value3 if test_data_g->value3>2
-
Examine
格式:x /FMT address,打印固定格式数据,例如16进制数据
例如: x /16x 0x191f5f0,以hex形式打印16个从0x191f5f0开始的数据
-
Info 指令
格式:info 功能 参数
例如:info reg eax
1、局部/全局变量
2、寄存器
3、断点
4、函数
5、…… -
thread 指令
1、info thread:查看所有线程
2、thread 线程id:切换到对应线程
-
显示调用栈指令
一、backtrace(bt)(±n)栈顶栈底
显示所有栈内容
二、down (n)
表示往栈顶方向下移 n 层
( n >0,默认值为 1),并打印出栈信息。
三、up (n)
up n 命令表示往栈底方向上移 n 层
,并打印出栈信息
5、GDB离线调试core文件
5.1 运行生成core文件
ulimit -c unlimited
5.2 设置core文件路径
[root@iZuf6f8d9q28dk29pfvn1nZ ~]# echo “core” > /proc/sys/kernel/core_pattern
5.3 生成core文件
如果发现有coredumpd 的情况,则会有文件生成
5.4 离线调试core文件
gdb + 可执行文件+ core文件