gdb基本调试命令

本文详细介绍了GDB的基本调试命令,包括设置断点、运行、查看变量值等,以及如何调试正在运行的程序、多进程和多线程环境下的调试技巧。同时强调了在服务器程序中使用日志的重要性,以避免因调试干扰真实并发情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本调试命令

编译程序时要加上-g,之后才能使用gdb调试:

gdb hello 	//gdb + 可执行程序
break(b) 10 //在第10行设置断点,简写b
info b		//查看断点信息
run(r)		//运行,运行到断点停止
next(n)		//执行当前行语句
print(p)    //显示变量的值
continue(c) //继续运行程序,直到遇到下一个断点
quit(q) 	//退出调试
step(s) 	//执行当前语句,如果语句是函数调用,则进入函数单步执行
list  		//显示源代码
bt			//查看函数调用堆栈

core dump

当出现了段错误:

ulimit -a  			//查看系统参数
ulimit -c ulimited	//把core文件的大小设为无限制
./hello    			//再次执行出错程序,会产生一个core文件
gdb hello core		//会看到程序哪一行导致的错误

调试正在运行的程序

gdb hello -p 进程编号   //ps -ef|grep hello 查看进程编号;进入gdb模式后,程序就会暂停

调试多进程

set follow-fork-mode parent //调试父进程,如果什么都不设置,默认调试父进程
set follow-fork-mode child  //调试子进程

//设置调试模式,on表示调试当前进程的时候,其他的进程继续运行
//如果用off,调试当前进程的时候,其它的进程被gdb挂起
set detach-on-fork[on|off] //缺省是on
info inferiors 		       //查看调试的进程
inferior 进程id		      //切换当前调试的进程

调试多线程

ps -aL|grep hello	        //查看正在运行的线程
pstree -p 主线程id	          //查看主线程和子线程的关系
info threads	            //查看所有线程信息
thread 线程id				   //切换线程
set scheduler-locking on	//只运行当前的线程,其它线程全部挂起
set scheduler-locking off	//运行全部的线程
thread apply 线程id	cmd	   //指定某线程执行某gdb命令
thread apply all cma		//全部的线程执行某gdb命令

服务器程序运行日志

设置断点或单步跟踪可能会严重干扰多进程/多线程之间的竞争关系,导致我们看到的是一个假象。一旦我们在某一个线程设置了断点,该线程在断点处停住了,只剩下另一个线程在跑,这时并发的场景已经被完全破坏了,通过调试器看到的只是一个和谐的场景(理想状态)。

可以使用输出log日志(将日志输出到屏幕上或输出到文件中)解决上述问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值