目录
GDB调试
gdb使用
设置汇编语法
set disassembly-flavor intel
转换为intel格式的汇编
set disassembly-flavor att
转换为att格式的汇编
gdb -tui filename 命令
help layout
显示layout指令的帮助内容layout src
显示源代码窗口和命令窗口layout asm
显示汇编代码窗口和命令窗口layout split
显示源代码窗口、汇编代码窗口及命令窗口layout regs
显示寄存器窗口
远程调试
进入gdb交互shell之后执行target remote host:port
- host: 远程主机的ip地址或者域名
- port:远程主机用于调试开放的端口
GDB常见命令
- s(step into) 步入函数(对应汇编的命令是si)
- n(next) step over 单步步过(对应汇编的命令是ni)
- p(print) 打印局部变量或者地址的值
- i(info) 用于显示各类信息
- bt(backtrace) 列出被调用的堆栈
- disas(disassemble) 显示汇编代码。
- until 执行到指定行。
cmd | description |
---|---|
i regs(info registers) | 查看当前寄存器的值 |
i args(info args) | 查看当前函数参数 |
i locals(info locals) | 查看当前局部变量 |
i f(info frame) | 查看栈帧的详细情况 |
i var(info variables) | 查看程序的变量符号 |
i func(info functions) | 查看程序中的函数符号 |
断点
- b(break) line 在line行下一个断点。
如b 32
表示在代码第32行下断点 - b(break) func 在func函数下断点
如b main
在main函数下断点, - b(break) line if condition 如果条件成立则在line行断下来。
如:b 10 if var=0
表示如果var等于10则在第10行停下来。 - b(break) *address 在地址address处下断点。
如:b *0x1234
表示在地址0x1234下断点 - d(delete) 删除断点,可以参照b(break)。
- finish 运行到程序结束,如果后面有断点,则运行至下一个断点。
查看内存
在gdb中使用x命令可以查看内存的内容,格式为x/<n/f/u> <address
n、f、u是可选参数,address是待查看的内存地址,address具体可以是寄存器,变量,地址
如:
x $ebx + n
x 0x1234
x pVar
x &var
参数说明
n | 具体参数为一个整数,表示显示内存的长度,也就从address开始向后显示n个内存单元的内容 |
f | 内存内容的显示格式,具体可以为x(十六进制)、d(十进制)、u(十进制无符号数)、o(八进制)、t(二进制)、a(按十六进制格式显示地址,并显示距离前继符号的偏移量(offset)。常用于定位未知地址(变量)。)、c(字符)、f(浮点数) |
u | 表示从地址address向后请求的位宽,如果不指定,gdb默认的位宽为4bytes。具体参数为b(字节)、h(双字)、w(四字)、g(八字),指定位宽之后,gdb从指定的地址按位宽将内存地址的内容读取出来。 |
cat /proc/[pid]/[maps]|[smaps]|[status]…
pid是你要查看的进程ID
-
maps
查看pid对应进程的代码段、栈区、堆区、动态库和内核区对应的虚拟地址。 -
smaps
通过查看其虚拟内存(堆区)是否不停增长来简单判断进程是否发生了内存溢出。 -
state
查看pid对应进程的状态 -
status
查看pid对应进程的状态信息 -
fd
pid对应进程的相关的所有文件描述符
cat /proc/meminfo
查看整机内存使用情况。
GCC编译
- gcc -D _DEBUG
使#ifdef _DEBUG生效
GDB调试(临时)关闭地址空间随机化
- 关闭ASLR:
set disable-randomization on
- 开启ASLR:
set disable-randomization off
- 查看ASLR状态:
show disable-randomization
gdb线程调试
pass
相关连接
https://sites.google.com/site/linux31family/home/home-1/–8/gccgdb/gccgdb-4
pwngdb调试
可以用命令以结构体的形式查看内存