在编写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)