GNU项目中的调试器 - GDB - Gnu DeBug

【版权申明】转载请附上出处链接 

GNU项目中的调试器 - GDB - Gnu DeBug

1. gdb的启动:

$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
shellgdb中执行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]
  • tbreak(temporary break)
    tbreak的使用与break一致, 但break断点到了一次后下次经过还会触发, 而tbreak只会触发一次;
  • hbreak(hardware break)
    hbreak的使用与break一致, 但hbreak的使用依赖于硬件特性.
2.3.1 断点的相关操作:
# 断点的删除 - 根据断点的序号
(gdb) delete [index1] [index2]...

# 断点的删除 - 删除全部断点
(gdb) delete breakpoints

# 断点的状态改变 - 指定某个断点 enable, 使能
(gdb) enable [index1] [index2]...
# 断点的状态改变 - 指定某个断点 disable, 失能
(gdb) disable [index1] [index2]...

# 断点的状态改变 - 所有断点 enable, 使能
(gdb) enable breakpoints
# 断点的状态改变 - 所有断点 disable, 失能
(gdb) disable breakpoints
2.3.2 使用gdb进行断点调试时, 断点的类型
  • 软件断点: 由非法指令异常实现(swi), 数量足够使用;
  • 硬件断点: 由硬件特性实现, 数量有限, 使用(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安河桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值