1-8 gdb调试

发布于:2025-03-01 ⋅ 阅读:(10) ⋅ 点赞:(0)

1 准备

gcc a.c -g -wall -O0 -o app
	
  • -g 生成的可执行程序是可调试的,就是在可执行程序中加入了源代码的信息,比如第几个可执行程序中的机械指令对应源代码的第几行
  • -wall 生成所有警告信息
  • -O0 不优化代码

2 启动和断点操作

# 启动gdb
gdb app

# 设置args参数
set args 参数
# 查看命令行参数
show args
# 设置 显示行数
set listsize 行数 #或者set list 行号

# 运行程序两种方法
start 
	- 只运行到main函数中的第一行
	- c (continue)继续运行到下一个有效断点
	- n (next) 单步调试
run
	- 直接运行程序到断点或结束
# 退出gdb调试
quit 
	== q

# 查看代码
list 
	=l 默认显示十行代码,使用↩︎再显示十行(重复执行)
	- list 行号 显示行号的上下文,默认十行
	- list 函数 显示函数的上下文,默认十行
	- list 文件:行号  切换文件
	- list 文件:函数  切换文件并显示函数
	
# 断点操作
break
	=b
b 行号
b 函数 停在函数第一行
	- b 文件名:行号
	- b 文件名:函数 
b 行号 if 变量名==某个值

# 查看断点
info 
	=i
i b # 显示所有断点的信息 
# 编号Num 状态Enb 作用位置What
# 可以通过操作编号来删除断点
d # delete
d 1 # 删除标编号1的断点
d 1-3 # 删除编号1~3的断点

# 将断点设置不可用
# dis = disable
dis num [num...]
dis numx-numy

# enable = ena
ena num [,,,]
ena numx-numy

3 调试命令

3.1 打印信息 print == p

格式化字符 说明
/x 以十六进制形式打印整数(如 255 显示为 0xff
/d 以有符号十进制形式打印整数(支持负数,如 -42
/u 以无符号十进制形式打印整数(仅限非负值,如 4294967295 用于 32 位)
/o 以八进制形式打印整数(如 64 显示为 0o100
/t 以二进制形式打印整数(如 5 显示为 0b101
/f 以浮点数形式打印值(自动识别单/双精度,如 3.141592
/c 以 ASCII 字符形式打印值(如 65 显示为 'A'
# 打印变量值
p 变量名
# 格式化变量值
p/x i
# 打印变量类型
ptype i

3.2 自动打印 display

# 设置自动打印
display/fmt 变量名1 2 3

# 取消自动打印有三种方式
# 1.两种删除打印
undisplay num...
delete display num...
# 2.是变量跟踪失效
disable display num...
enable display num... # 恢复生效

3.3 单步调试

命令 效果
step == s 向下执行一行,遇到函数会进入函数体
finish 跳出函数体(需要保证函数体内没有生效的断点)
next = n 向下执行一行,但是不会进入函数体
until 跳出循环体(需要满足两个条件:1、循环体内不能有有效断点 。 2、在循环体的开始或结束行执行, 比如for 这一行))

3.4 设置变量

这里设置的程序内的变量值,比如循环控制变量i

set var 变量名 =