$gdb
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty"for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration"for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type"help".
Type "apropos word" to search for commands related to "word".(gdb)$gdb a.out [core_dump_file]
2. gdb的指令集(复杂的后面单独拿出来分析):
命令
解释
举个例子
file
载入目标程序
(gdb) file a.out
next [n]
执行接下来的n行代码(默认执行1行)
(gdb) next
run
运行目标程序
(gdb) run
attach [pid]
绑定目标进程(pid 进程号, ps查看). 绑定成功后目标进程将会被暂停执行
(gdb) attach 777
continue
继续执行/恢复执行
(gdb) continue
print
查看变量值
(gdb) print [value_name]
step
单步执行(遇到函数将会进入函数体)
(gdb) step
return [value]
强制当前函数立刻返回
(gdb) return 0
finish
运行至当前函数返回
(gdb) finish
until [line]
执行至目标行line
(gdb) util 66
jump [line]
立刻跳转到目标行line
(gdb) jump 66
watch
监视变量是否被改变(数据断点)
(gdb) watch val_name
display [/f] [expression]
断点处自动打印
(gdb) display /d value
undisplay
取消断点处自动打印
(gdb) undisplay
whatis
查看程序中的符号
(gdb) whatis value
ptype
查看程序中的符号
(gdb) ptype value
list
代码查看
(gdb) list
shell
gdb中执行shell操作
(gdb) shell ls
2.1 gdb中的info指令
# 查看当前存在的断点(gdb) info breakpoints
# 查看当前寄存器的值(gdb) info registers
# 查看当前函数调用的栈帧信息(gdb) info frame
# 查看当前函数参数的值(gdb) info args
# 查看当前局部变量的值(gdb) info locals
# 查看程序中的变量符号(gdb) info variables
# 查看程序中的函数符号(gdb) info functions
2.2 gdb中的set指令
(gdb) set [object] [arg1]...
# 设置命令行参数(gdb)set args 1 2 str
# 设置变量值(gdb)set var value=123
(gdb)set var gpointer =(int *)malloc(sizeof(int))# 设置代码查看时打印多少行(gdb)set listsize 10
2.3 断点中的break / tbreak / hbreak
break gdb设置断点的命令, 可以通过函数名设置断点, 也可以通过文件名+行号设置断点.
(gdb)break[func](gdb)break[func][if var == xxx](gdb)break[file_name]:[line_num](gdb)break[file_name]:[line_num][if var == xxx]
硬件断点: 由硬件特性实现, 数量有限, 使用(gdb) show can-use-hw-watchpoints查询硬件断点的数量;
数据断点: 实际上是硬件断点, 用于监视数据发生变化;
2.4 gdb中的内存查看
# gdb可以查看任意内存地址的数据
格式: x /NSF address
N 需要打印的单元数
S 每个单元的大小
b 单字节
h 双字节
w 四字节
g 八字节
F 数据打印的格式
x 十六进制
d 有符号十进制
u 无符号十进制
o 八进制
t 二进制
a 地址
c 字符
f 浮点数
举个例子:
(gdb) x /4bx 0x20200509
2.5 gdb中的函数调用栈
# 查看函数调用的顺序(函数调用栈的信息)(gdb) backtrace
# 切换至栈编号为N的上下文中(即在某个函数中停住)(gdb) frame N