gdb调试多线程多进程

时间:2021-06-30 16:39:56

今天进行学习一下关于gdb调试多线程和多进程的情况:

gdb调试多进程


尝试来调试多进程的程序,我们使用gdb进行调试程序,gdb的调试默认是调试父进程的,但是为了做到可以对父进程和子进程都做到调试,所以附加了调试子进程的功能。

我们可以对fork出来的进程进行设置调试方法。

follow-fork-mode的用法为:

set follow-fork-mode parent/child

如果你选择了parent,这个时候就是进行gdb调试父进程。
如果你选择了child,这个时候就是进行gdb调试子进程。

示例程序:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int count =0;
pid_t id=fork();
if(id>0)
{
while(count++)
{
if(count>3)
{
break;
}
}

}
else if(id==0)
{
int i=0;
while(i<3)
{
i++;
count--;
}
}
else
{
perror("fork");
exit(1);
}
return 0;
}

记得在编译代码的时候要加上-g选项。

然后我们gdb打开调试文件。

我们来进行调试子进程,
gdb调试多线程多进程

然后我们进行打断点进行调试,观察count的变化。

首先打断点
gdb调试多线程多进程

然后运行至断点处。
gdb调试多线程多进程

然后我们进行单步执行,
gdb调试多线程多进程
我们发现调试跳过了父进程。 进入了子进程。
gdb调试多线程多进程
接下来我们就可以调试子进程的代码了。
gdb调试多线程多进程

上述就是进行子进程程序代码的调试,父进程的调试当然和子进程是一样的,所以我这里就不多说了。并且记得啊,如果你在调试的过程中更改mode是没有用的,只对下一次fork以后是起作用的。

另外,gdb在多进程的调试中还有一个detach-on-fork参数。作用是指示GDB在fork之后是否断开某个进程的调试,或者都交由GDB控制:

cpp
set detach-on-fork on/off

on表示断开调试follow-fork-mode指定的进程,off表示gdb将控制父进程和子进程

所以我们也可以使用detach-on-fork的设置进行多个进程调试。

首先打开进行调试,然后进去输入set detach-on-fork off,现在我们就可以进行多个进程调试了然后我们打上断点。运行至断点处。
gdb调试多线程多进程

然后我们n调用fork。fork以后,我们就可以使用i inferiors,这个命令是用来查看进程状态的,我们现在就可以发现,处在gdb的是两个进程都在调试。
gdb调试多线程多进程

然后我们可以通过inferior+进程序号的方式进行切换进程。例如inferior 2。这样就可以切换进程进行调试。
gdb调试多线程多进程

gdb多线程的调试


接下来进行多线程的gdb的调试。
首先我们写出我们的多线程的示例代码。

#include<stdio.h>
#include<pthread.h>
void *id_run(void *arg)
{
printf("id%d run gdb success\n",(int )arg);
}
int main()
{
pthread_t id1;
pthread_t id2;

pthread_create(&id1,NULL,id_run,(void *)1);
pthread_create(&id2,NULL,id_run,(void *)2);

return 0;
}

一份简单的小代码,目的是为了向大家介绍多线程的gdb调试。

首先我们来学习一下关于多线程的调试中gdb的一些命令。
1. info threads:显示当前可调式的所有线程,gdb为每一个线程分配ID,这个ID后续操作的时候进行使用。
gdb调试多线程多进程
2. thread ID :切换到当前调试的线程的指定ID。

gdb调试多线程多进程
3. set scheduler-locking off|on|step :在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,通过这个命令就可以就可以实现这个要求,off是不锁定任何线程,也就是所有的线程都执行,这个是默认值。on是只有当前线程执行。step是在单步的时候,除了next过一个函数的情况意外,只有当前线程会执行。

gdb调试多线程多进程
4. set print thread-events :用于设定是否提示线程启动或停止时信息。
5. thread apply ID command :让ID线程执行命令command。
6. thread apply all command :让所有线程执行命令command。
gdb调试多线程多进程