GDB
0x10 什么是GDB
GDB是GNU程序的一个debugger, 允许查看其他程序运行时内部的情况,或者当一个程序崩溃时的运行情况
0x11特性
- 程序开始后, 指定可能影响程序行为的任何操作
- 让程序在特定的条件下停止
- 当程序停止后,检查发生了什么
- 在程序中做一些操作, 比如试着修复一个bug或者尝试找到更多的问题
0x20 GDB支持哪些语言
- Ada
- Assembly
- C
- C++
- D
- Fortran
- Go
- Objective-C
- OpenCL
- Modula-2
- Pascal
- Rust
0x30 GDB使用
测试代码demo.c
#include<stdio.h>
#include<malloc.h>
#include<unistd.h>
#include<string.h>
int main(){
int size = 0x70;
void *p = malloc(size);
void *q = malloc(size);
void *junk = malloc(size);
sleep(0);
free(q);
sleep(0);
printf("%p\n",q);
int *r = malloc(0x60);
printf("%p\n",r);
sleep(0);
return 0;
}
编译命令:-o 输出文件 -g 调试模式
gcc -o demo -g demo.c
-
进入gdb命令
gdb demo
-
查看源代码
list or l
-
运行此程序
run[arg] or r
: 可以指定程序执行的参数 -
断点(在程序执行期间暂停,用以调试程序)
break[function name] or b
:如下图 对sleep 进行打断点break[line number] or b
:break也可以对行数进行断点break[if condition]
也可以break 一个判断条件 -
程序继续执行
continue [repeat count] or c
:如下图 执行continue 程序会继续执行,直到下一个break断点 -
程序单步步过
next or n
:该指令会帮助程序在遇到断点后继续执行 -
程序单步进入
step or s
:如果遇到函数,程序会进入到函数此函数中 -
查看堆信息
heap
:下图是执行第一个break后 heap的情况,我们malloc了3个0x70大小的chunk,根据libc源码所写,malloc一个0x70的堆块,会占用0x80的大小,所以会有0x602000、0x602080、 0x602100三个堆块,最后一个堆块是top chunk -
查看内存
x/<n/f/u> <addr>
- n 是一个整数 表示显示内存的长度
- f 表示显示的格式
- x (hex) 按照十六进制格式显示
- d (decimal) 按照十进制格式显示
- u (unsigned)按照十六进制显示无符号整形
- o (octal) 按照八进制格式显示
- t (binary)按照二进制格式显示
- a (address) 按照十六进制格式显示
- c (char) 按照字符格式显示
- f (float) 按照浮点数格式显示
- i 按照指令地址格式显示
- u 表示将多少个字节作为一个值取出来,GDB默认4个bytes
- b 表示单字节
- h 表示双字节
- w 表示四字节
- g 表示八字节
-
查看栈信息
stack
-
查看bin链
bins
如下图 当程序运行到第二个sleep时,q被free掉 0x70大小的堆块会直接进入fastbin中, 使用bins命令可以查看当前bin链情况 -
退出gdb
quit or q