基本调试命令
编译程序时要加上-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日志(将日志输出到屏幕上或输出到文件中)解决上述问题
标签:命令,gdb,线程,进程,断点,hello,调试 From: https://blog.csdn.net/PM26000/article/details/137436593