[总结]gdb调试多进程/线程的命令

时间:2021-07-11 08:11:37

  在编写linux代码时,根据某些场景,我们需要fork出一个/多个子进程来协助父进程完成一些工作.

  当然多进程编程本身并不是特别的麻烦,通过pid的分流来使不同的子程序处理不同的流程.

  当我们编写的多进程出现bug需要调试时,我们如何通过gdb来调试多进程呢?

  本文主要分享在gdb下,如何调试多进程/线程.

一、gdb调试多进程

  在gdb调试时会默认进入到父进程,因此如果我们想切换到子进程,需要一下指令:

set follow-fork-mode parent //进入父进程(默认)
set follow-fork-mode child //进入子进程

  根据本人亲测,如果进入选择进入一个进程,那么其它进程(另外一个进程)将会异步执行.

  如果这样的话,有些情况下显然是不利于调试的.如果我想调试一个进程时,使另外一个进程阻塞,该怎么办?

set detach-on-fork on  //调用fork之后,相关进程分离运行(默认)
set detach-on-fork off  //调用fork之后,相关进程被阻塞

  这样的话在调试一个进程时,其他进程会被阻塞,而不会对本进程的调试产生不必要的影响.

  那么问题又来了!假设我调试完父进程,想跳转到子进程进行调试怎么办?

info inferiors   //查看进程信息
inferior num  //切换到num的进程

   以上便是gdb调试多进程的基本命令.下面我们来看多线程:

二、gdb调试多线程

  想对于多进程,多线程的调试就显得简单得多!

info threads    //显示所有线程
thread 1        //切换到id为1的线程

  多线程的调试,默认是阻塞.也就是说,当你切换进一个线程时,其他线程会阻塞起来,而不会异步执行.

  但与多进程的阻塞有些许差别:当你在不同线程中下了断点,然后通过c或者n时,gdb也会追踪到其他线程中.(即同步执行)

  那么问题又来了!一些场景下,就需要变态的需求:希望就只调试本线程,不要切换到其它线程的断点处,怎么办?

  这个问题也是非常简单,一条命令即可:

set scheduler-locking off           //其他线程同步执行(默认)
set scheduler-locking on            //仅调试进程执行
set scheduler-locking step         //在单步时,仅调试进程运行

  以上便是本人调试多进程与多线程的常用方法,下文再见!

  (测试代码:https://github.com/gaoxiaodiao/Linux/tree/master/LinuxCode/DebugMutiProcess)