GDB使用
1.GDB介绍:
GDB是linux系统中最常用的程序调试器
2.GDB安装:
1)检查是否安装gdb
运行指令:
rmp -qa | grep gdb
或者
gdb --version
没安装直接安装
kali的话建议直接执行
sudo apt-get install gdb
如果是Centos,建议看这篇博客:【Linux】GDB调试教程(新手小白)_this gdb was configured as "x86_64-unknown-linux-g-CSDN博客
3.GDB入门操作
1)一些常用指令操作
命令 简写形式 说明
backtrace bt、where 显示backtrace
break b 设置断点,+行号表示在那一行打断点
continue c、cont 继续执行,从一个断点处,直接运行至下一个断点处【VS下不断按F5】
delete d 删除断点
finish 运行到函数结束
info breakpoints 显示断点信息
next n 执行下一行
print p 显示表达式,打印变量值
run r 运行程序
step s 一次执行一行,包括函数内部
x 显示内存内容
until u 执行到指定行
其他命令
directory dir 插入目录
disable dis 禁用断点
down do 在当前调用的栈帧中选择要显示的栈帧
edit e 编辑文件或者函数
frame f 选择要显示的栈帧
forward-search fo 向前搜索
generate-core-file gcore 生成内核转存储
help h 显示帮助一览
info i 显示信息
list l 显示函数名或行
nexti ni 执行下一行(以汇编代码为单位)
print-object po 显示目标信息
sharelibrary share 加载共享的符号
stepi si 执行下一行
disable b(breakpoint) + 编号 —— 使一个断点无效【禁用断点】
n(next) —— 逐过程【相当于F10,为了查找是哪个函数出错了】
display —— 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】
2)创建调试程序
这里说一下为什么要用-g,因为-g表示把文件编译成debug形式,可以执行调试,如果gcc编译的时候没有加上-g参数,那么就不会保留调试参数,就不能用gdb调试)
vim test.c
gcc -g -o test.exe test.c
进入test.c后按i进入编辑模式,写好代码后按esc,然后按 : 再按wq保存退出,接着就可以执行下面的指令了
3)启动gdb
程序发生异常崩溃时,系统可以将崩溃时的内存数据保留下来,通常称为core文件,gdb可以调试这种文件,所以我们可以打开core dump功能
ulimit -a
如果 core file size(core 文件大小)对应的值为 0,表示当前系统未开启 core dump 功能
开启
ulimit -c unlimited
启动gdb开始调试文件
- gdb 要调试的文件:开始调试程序
- l :随机显示10行源代码
l 编号:从第几行开始显示源码,比如l 10 表示从第10行开始显示源码
注意:gdb可以自动记忆之前输入的命令,如果上次输入了l显示了10行代码,那么直接按Enter 就可以再显示10行
- b 行号:在代码的某一行打断点
- b 源文件:函数名 :表示在该函数的第一行打上断点
- b 源文件:行号 :在该源文件中的这一行加上一个断点
- info b:查看断点信息 (直接info 的话就是所有的调试信息)
断点的一下字段信息
Num -编号 Type -类型 Disp -状态 Enb -是否可用 Address -地址 What -在此文件的哪个函数的第几行 最后的话就是每个断点信息的下面这块 **`<span>breakpoint already hit 1 time</span>`** 即此断点被命中1次
- d 当前要删除断点的编号:删除一个断点(注意是编号,每一个断点都有一个编号,比如删除编号为4的断点,再打一个断点时,编号为5,即删除的断点编号不会消失,下一次打断点编号续上
- d breakpoints:删除所有断点
- disable b:是所有断点无效
- enable b:使所有断点有效
- r :运行程序,如果程序没有打断点,那么执行r时直接运行到程序结束
- n :逐句调试,单步步过,相当于IDA中的F8
- ni :逐机器指令调试,即一次执行一条机器指令,n是执行代码语句
- s:单步步入,相当于IDA中的F7,
- si :逐机器指令调试,即一次执行一条机器指令,s是执行代码语句
- display 变量:追踪某一变量的值
- set var 变量:修改变量的值
- util 行号:程序直接运行到哪一行
- p 变量:打印变量的值
- p *p@3:印指针指向的内容,@后面跟的是打印的长度
- finish:在一个函数内部,执行到当前函数返回,然后停下来等待命令,当s进入某一函数时,直接执行finish,这样函数运行完,直接回到调用函数的地方,return一个值
- c:从一个断点处,直接运行到下一个断点处
设置打印格式
- x 按十六进制格式显示变量
- d 按十进制格式显示变量
- u 按十六进制格式显示无符号整型
- o 按八进制格式显示变量
- t 按二进制格式显示变量
- a 按十六进制格式显示变量
- c 按字符格式显示变量
- f 按浮点数格式显示变量
(gdb) p/x a(按十六进制格式显示变量)
- q 退出调试
参考文章:【Linux】GDB调试教程(新手小白)_this gdb was configured as "x86_64-unknown-linux-g-CSDN博客
[【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?)_linux gdb标准输入-CSDN博客](https://blog.csdn.net/weixin_45031801/article/details/134399664)
至此,gdb调试器的学习已经结束了