【Linux】使用gdb调试多进程&多线程

3/8/2017来源:ASP.NET技巧人气:1789

gdb调试多进程


多进程时,进入调试状态后,默认调试主进程。 1. 查找fork出子进程的代码在第几行,然后打上断点。 这里写图片描述

2.运行至断点处,info feriors可查看当前调试的进程 这里写图片描述

3.设置follow-fork-mode 的值为child,表示只调试的子进程,再查看当前调试进程发现变成了新产生出来的进程,即子进程。follow-fork-mode(默认值是parent)和detach-on-fork(默认值是on)结合使用。4种组合的意义分别如下:

follow-fork-mode detach-on-fork 说明
parent on 只调试父进程
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置

所以我们set follow-fork-mode child ,detach-on-fork没有设置,默认是on,即第二种使用场景,只调试子进程。 这里写图片描述 4.可以使用inferior+进程编号(即info inferiors后显示在第一列的号码)来切换当前正在调试的进程。 这里写图片描述 以上就是调试多进程用到的命令。

gdb调试多线程


1.在创建完线程的代码处打上断点,运行至断点处,info threads查看当前进程内的线程。可以看到,当前正在调试的是主线程。 这里写图片描述 2.和多进程类似,可以使用thread+线程编号切换当前正在调试的线程。 所以,thread 后*号到了编号为3的线程的前面,表示当前调试的就是该线程。 这里写图片描述 3.使用thread apply [编号…] [命令]可以让多个线程同时执行某条命令。 如:让2,3线程同时向下执行一步。也可以使用thread apply all [命令],让所有线程执行某个调试命令。 这里写图片描述 4.可以设置scheduler-locking参数(默认值为off),控制是多个线程同时运行还是只运行某个线程,它的取值和意义如下:

scheduler-locking 意义
on 当前调试的线程单独运行
off 所有线程一起执行
step 没有发生函数调用时单独执行当前线程,有函数调用时所有线程一起执行

这里写图片描述 有关于多线程调试的常用命令大概就是这些。