多线程
通过set non-stop 来设置当一个线程中断在断点时,整个程序其他线程可以继续运行。
通过info threads 来查看生成的子线程
通过thread 编号可以切换线程
多进程
当我们调试多进程程序前,需要设置俩个选项。
follow-fork-mode (默认parent)和 detach-on-fork(默认on)
follow-fork-mode detach-on-fork 含义
parent on 只调试主进程
child on 只调试子进程
parent off 同时调试多个进程,gdb跟踪主进程,子进程在fork后阻塞
child off 同时调试多个进程,gdb跟踪子进程,主进程在fork后阻塞
设置方法:
set follow-fork-mode parent或者child set detach-on-fork on或者off
查看是否设置成功:
show follow-fork-mode show detach-on-fork
显示进程信息
info inferiors
切换进程
inferior num(上一个选项显示在屏幕上的下标号)
tips:
这里我开始在调试的时候,用inferior 指令切换时,按n无法执行...... 显示
#0 0x00110424 in ?? (gdb) n
Cannot find bounds of current function
Cannot find bounds of current function
所以这里需要在切换后,输入 continue (或者c)命令即可
Tips 测试代码:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void* Run(void*k)
{
int i=2;
printf("hello i am 3 lwp my data:%d,lwp:%u\n",i,pthread_self());
return (void*) "hello i am lwp 3 return vale";
}
int main()
{
pthread_t lwp;
pid_t id=fork();
// pthread_create(&lwp,NULL,Run,NULL);
if(id==0)
{
int i=1;
printf("hello i am 2 lwp my data:%d,lwp:%d\n",i,getpid());
return 0;
}
else
{
void * ret_pth=NULL;
int i=0;
int ret=0;
printf("hello i am 1 lwp my data:%d,lwp:%d\n",i,getpid());
if((ret=waitpid(id,NULL,0))>0)
{ printf("hello success wait id:%d\n",ret);}
if(pthread_join(lwp,&ret_pth)==0)
{
printf("haha wait success pthread,his return val:%s\n",(char*)ret_pth);
}
}
return 0;
}
多线程调试例子: