GDB调试

1.启动和退出gdb
	1.1启动gdb
	gdb app
	
	1.2命令行传参
	int main(int argc, char* argv[]) argc, argv 是命令行参数
	//设置的时机:启动gdb之后,在应用程序启动之前
	set args 参数1 参数2 参数3 ... ...
	//查看设置的命令行参数
	show args
	
	1.3gdb中启动程序
	方式1:run(r)
	方式2:start
	
	区别:
	如果程序中设置了断点会停在第一个断点的位置, 如果没有设置断点, 程序就执行完了
	最终会阻塞在main函数的第一行,等待输入后续其它 gdb 指令
	
	程序start之后继续运行,或者在断点处继续运行,使用continue(c)命令
	
	1.4退出gdb
	quit(q)
	
2.查看代码
	3.1当前文件
	默认情况下使用list查看代码信息位于入口函数main对应的那个文件中
	//从第一行开始显示
	list(l)
	//列出行号对应的上下文代码,默认显示10行内容
	list 行号
	//显示这个函数的上下文内容,默认显示10行内容
	list 函数名
	
	若想继续查看后面内容,执行list命令,或者回车
	
	3.2切换文件
	//切换到指定文件,并列出行号对应的上下文代码,默认显示10行内容
	l 文件名:行号
	//切换到指定文件,并显示这个函数的上下文内容,默认显示10行内容
	l 文件名:函数名
	
	3.3设置显示的行数
	set listsize 行数
	//查看当前list一次显示的行数
	show listsize
	
3.断点操作
	3.1设置断点
	两种方式:第一种是常规断点,程序只要运行到这个位置就会被阻塞;第二种是条件断点,只有指定的条件被满足程序才会在断点处阻塞
	
	//设置普通断点到当前文件
	break(b) 行号
	break(b) 函数名         ------停在函数的第一行
	
	//设置普通断点到某个非当前文件上
	b 文件名:行号
	b 文件名:函数名         ------停在函数的第一行
	
	//设置条件断点
	b 行数 if 变量名==某个值
	
	3.2查看断点
	可以通过 info break命令查看设置的断点信息,info可以简写为 i
	i b
	
	# 举例
	(gdb) i b
	Num     Type           Disp Enb Address            What
	1       breakpoint     keep y   0x0000000000400cb5 in main() at test.cpp:12
	2       breakpoint     keep y   0x0000000000400cbd in main() at test.cpp:13
	3       breakpoint     keep y   0x0000000000400cec in main() at test.cpp:18
	4       breakpoint     keep y   0x00000000004009a5 in insertionSort(int*, int) 
													   at insert.cpp:8
	5       breakpoint     keep y   0x0000000000400cdd in main() at test.cpp:16
	6       breakpoint     keep y   0x00000000004009e5 in insertionSort(int*, int) 
													   at insert.cpp:16
	Num:断点编号
	Enb:当前断点状态
	What:断点被设置在哪个文件哪行或哪个函数
	
	3.3删除断点
	#delete == del == d
	//删除第一个断点
	d 1
	//删除第2、4、6个断点
	d 2 4 6
	//删除一个范围,编号num1-numN
	d num1-numN
	
	3.4设置断点状态
	若某个断点只是临时不需要,可以设置为不可用状态,disable 断点编号;需要时,enable 断点编号
	//设置断点无效
	#disable == dis
	dis 断点编号
	//设置某个区间断点无效
	dis 断点编号1-断点编号N
	
	//让无效的断点生效
	#enable == ena
	ena 断点编号
	//设置某个区间断点有效
	ena 断点编号1-断点编号N
	
4.调试命令
	4.1继续运行gdb
	continue(c)
	
	4.2手动打印信息
		4.2.1打印变量值
		print(p)
	
		格式化字符(/fmt)	说明
		/x	以十六进制的形式打印出整数。
		/d	以有符号、十进制的形式打印出整数。
		/u	以无符号、十进制的形式打印出整数。
		/o	以八进制的形式打印出整数。
		/t	以二进制的形式打印出整数。
		/f	以浮点数的形式打印变量或表达式的值。
		/c	以字符形式打印变量或表达式的值。

		p 变量名
		//如果变量是一个整形,默认对应的值是以10进制输出
		#例子
		# 举例
		(gdb) p i       # 10进制
		$5 = 3
		(gdb) p/x i     # 16进制
		$6 = 0x3
		(gdb) p/o i     # 8进制
		$7 = 03
		
		4.2.2打印变量类型
		ptype 变量名
		
	4.3自动打印信息
		4.3.1设置变量名自动显示
		频繁查看某个变量或表达式的值,使用display
		//自动打印变量的值(设置一次,以后会自动显示)
		display 变量名
		//以指定的整形格式打印变量值
		display/fmt 变量名
		
		4.3.2查看自动显示列表
		info display
		
		4.3.3取消自动显示
		undisplay num1
		//取消某个范围内
		undisplay num1-numN
		//不删除自动显示的变量,禁用自动显示列表中处于激活状态下的变量或者表达式
		disable display num1
		//需要启用显示列表中被禁用的变量或者表达式
		enable display num
	
	4.4单步调试
		4.4.1step
		执行一行代码,会进入函数中
		
		4.4.2finish
		若通过step单步调试进入函数内,使用finish可跳出函数体,且函数体内不能有有效断点
		
		4.4.3next
		单步,但不会进入函数内
		
		4.4.4until
		直接跳出某个循环体
		注意:循环体内不能有有效断点;必须要在循环体的开始/结束行执行该命令
		
	4.5设置变量值
	set var 变量名=值
	
			

	
	
	
	
	
	
	

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会C语言的男孩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值