使用gdb调试多进程多线程代码

gdb简介

  • GDB是GUN开源组织发布的一个强大的UNIX下的程序调试工具。或许,平时大家更加习惯图形界面的调试,比如VS上的IDE调试;但是如果我们在UNIX或Linux下做软件,我们呢就更加需要熟练GDB这个调试工具。
  • GDB调试使用的是DEBUG版本的,而使用gcc或者g++默认生成的可执行文件为release版本,所以在生成可执行文件时,我们需要在命令的尾部加上 -g,这样就可以生成的是DEBUG版本下的可执行文件。

gdb调试代码的基本常用命令

命令 作用
list或l+行号 显示从行号开始的源代码(缺省为10行,下面都是)
list或l+行号 显示某个函数的源代码
run或r 运行程序
step或s 单步执行,遇到函数进入
next或n 单步执行,遇到函数不进入
break或b + 行号 在某一行设置断点
break + 函数名 在某个函数开头设置断点
info break或i b 查看断点信息
d + 断点序号 删除序号为n的断点
finish或f 执行到当前函数返回,然后停下来等待命令
print或p + 变量名 打印变量的值
whatis + 变量名 查看变量类型

gdb调试多进程

  • 在默认情况下是调试多进程程序时GDB会默认调试主进程,但是GDB支持多进程的分别与同步调试。即GDB支持同时调试多个进程,只需要设置follow-fork-mode(默认为parent)和detach-on-fork(默认为on)即可。我们还可以使用catch fork指令,如果fork异常,会停止程序。
  • 显示follow-fork-mode信息
show follow-fork-mode 
  • 显示detach-on-fork信息
show detach-on-fork

这里写图片描述

follow-fork-mode detach-on-fork 说明
parent on 只调试父进程(gbb)默认
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block(阻塞)在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置
  • 设置follow-fork-mode和detach-on-fork方法
set follow-fork-mode [child]/[parent] //设置为child或者parent
set detach-on-fork [on]/[off]//设置为onoff

这里写图片描述

gdb调试多线程

  • GDB默认支持调试多线程,跟主线程,子线程阻塞在create thread。
  • gdb调试一般有两种模式:all-stop模式和no-stop模式(gdb7.0之前不支持no-stop模式)。
    • all-stop:在这种模式下,当你的程序在gdb由于任何原因而停止,所有的线程都会停止,而不仅仅是当前的线程。
    • no-stop:当程序在gdb中停止,只有当前的线程会被停止,而其他线程将会继续运行。
  • 打开 no-stop方法:vim ~/.gdbinit
    这里写图片描述
命令 作用
info threads 显示所有可调试的线程
thread ID 切换到指定线程,gdb为每一个线程分配一个ID(与tid不同),编号一般从1开始
set scheduler-locking off/on/step off表示不锁定任何线程,on表示只有当前调试的线程会继续运行,step表示在单步执行时只有当前线程会运行
show scheduler-locking 显示当前模式

猜你喜欢

转载自blog.csdn.net/virgofarm/article/details/80736345