您的位置:首页 > 运维架构 > Linux

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

2017-03-03 23:11 603 查看
gdb调试多进程

多进程时,进入调试状态后,默认调试主进程。

1. 查找fork出子进程的代码在第几行,然后打上断点。



2.运行至断点处,info feriors可查看当前调试的进程



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

follow-fork-modedetach-on-fork说明
parenton只调试父进程
childon只调试子进程
parentoff同时调试两个进程,gdb跟主进程,子进程block在fork位置
childoff同时调试两个进程,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没有发生函数调用时单独执行当前线程,有函数调用时所有线程一起执行


有关于多线程调试的常用命令大概就是这些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gdb linux 调试