多进程调试
我们使用gdb调试程序,gdb的调试默认是调试父进程的,如果要做到对父进程和子进程都做到调试,所以附加了调试子进程的功能。
follow-fork-mode detach-on-fork 操作
parent on 只调试主进程
child on 只调试子进程
parent off 同时调试两个进程,gdb跟进父进程,子进程block在fork处
child off 同时调试两个进程,gdb跟进子进程,父进程block在fork处
注:设置方法:
set follow-fork-mode [parent|child]
set detach-on-fork [on|off]
启动方法
gbd program
gdb program core
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 void son_fun()
6 {
7
8 pid_t pid=getpid();
9 printf("son:%d\n",pid);
10 }
11 void father_fun()
12 {
13 pid_t pid=getpid();
14 printf("father:%d\n",pid);
15 }
16 int main()
17 {
18 pid_t id=fork();
19 if(id<0)
20 {
21 perror("fork");
22 exit (1);
else if(id==0)
25 {
26 son_fun();
27 }
28 else
29 {
30 father_fun();
31 }
32 return 0;
33 }
其他重要命令
add-inferior [-copies n] [-exec executable]
添加新的调试进程,可以用file executable来分配给inferior可执行文件。增加n个inferior并执行程序为executable。如果不指定n只增加一个inferior。如果不指定executable,则执行程序留空,增加后可使用file命令重新指定执行程序。这时候创建的inferior其关联的进程并没启动。
remove-inferiors infno
删除一个infno号的inferior。如果inferior正在运行,则不能删除,所以删除前需要先kill或者detach这个inferior。
clone-inferior [-copies n] [infno]
复制n个编号是infno的inferior。如果不指定n的话,就只复制一个inferior。如果不指定infno,则就复制正在调试的inferior。
detach inferior infno
detach去掉编号是infno的inferior。注意这个inferior还存在,可以再次用run命令执行它。
kill inferior infno
kill掉infno号inferior。注意这个inferior仍然存在,可以再次用run等命令执行它
多线程调试
gbd默认支持调试多线程,跟踪主线程,子线程断点在create thread。
set scheduler-locking off |on|step
在使用step或continue命令调试当前被调试线程的时候,其他线程也同时执行。
如果只让被调试程序执行,我们需要以下命令。
命令 含义
off 不锁定任何线程,也就是所有线程都执行,默认值。
on 只有当前被调试程序执行
step 在单步的时候,出来next过一个函数的情况(设置断点然后continue的行为)。
2. 调试程序
以下面程序为例进行调试:
void* thread1(void* arg)
{
printf("thread1, tid is %lu\n", pthread_self());
return NULL;
}
void* thread2(void* arg)
{
printf("thread2, tid is %lu\n", pthread_self());
return NULL;
}
int main()
{
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
原文:https://www.cnblogs.com/lidabo/p/14746048.html