在gdb調試多線程好人多進程的程序上面,默認的是調試主程序。但是gdb是支持調試多線程和多進程的。
調試多進程
在調試多進程的時候需要設置follow-fork-mode(默認parent) 和 detach-on-fork(默認on)
的值
設置方法:set follow-fork-mode [parent|child] set detach-on-fork [on|off]
- 查詢正在調試的進程:info inferiors
- 切換調試的進程: inferior
- 添加新的調試進程: add-inferior [-copies n] [-exec executable] ,可以用file
executable來分配給inferior可執行文件。 - 其他:remove-inferiors infno, detach inferior
實例
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
pid_t pid;
if((pid = fork())<0){
perror("fork");
exit(-1);
}
if(pid == 0){
int i = 0;
for(;i<10;i++)
printf("I`m child! pid = %d,ppid = %d\n`",getpid(),getppid());
}
else{
int i = 0;
wait();
for(;i<10;i++)
printf("I`m parent! pid = %d,ppid = %d\n`",getpid(),getppid());
}
return 0;
}
1、設置跟進的進程
2、進入子進程
切換進程
查詢正在調試的進程:info inferiors
調加新的調試進程:add-inferior[-copies n][-exec executable]
切換調試的進程:inferior num
調試多線程
在gdb裏面默認支持多線程的調試。
常見的多線程調試命令:
info+threads:顯示可以調試的所有線程。gdb會爲每個線程分配一個ID(和tid不同),編號一般從1開始。後面的ID是指這個ID。
thread+ID:切換當前調試的線程爲指定ID的線程。
實例
#include<pthread.h>
#include<stdio.h>
pthread_mutex_t lock;
pthread_cond_t cond;
int count = 100;
void* pthread_run(void* arg){
pthread_mutex_lock(&lock);
if(count < 0){
pthread_mutex_unlock(&lock);
return NULL;
}
while(count){
pthread_cond_wait(&cond,&lock);
printf("count = : %d\n",count);
count--;
pthread_mutex_unlock(&lock);
}
}
int main(){
pthread_t tid;
int i = 100;
pthread_mutex_init(&lock,NULL);
pthread_cond_init(&cond,NULL);
pthread_create(&tid,NULL,pthread_run,NULL);
while(i--){
sleep(1);
pthread_cond_broadcast(&cond);
}
pthread_join(tid,NULL);
return 0;
}
查看進程裏面的線程號,在跟進指定的線程:
調試多線程用到的其他命令:
- break FileName.cpp:LinuNum thread
all:所有線程都在文件FileName.cpp的第LineNum行有斷點。 - thread apply ID1 ID2 IDN command:多個線程執行gdb命令command。
- thread apply all command:所有線程都執行command命令。
- set scheduler-locking
off|on|step:在調式某一個線程時,其他線程是否執行。off,不鎖定任何線程,默認值。on,鎖定其他線程,只有當前線程執行。step,在step(單步)時,只有被調試線程運行。 - set non-stop on/off:當調式一個線程時,其他線程是否運行。
- set pagination on/off:在使用backtrace時,在分頁時是否停止。
- set target-async
on/ff:同步和異步。同步,gdb在輸出提示符之前等待程序報告一些線程已經終止的信息。而異步的則是直接返回。