【Linux】多進程和多線程的調試!!

在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在輸出提示符之前等待程序報告一些線程已經終止的信息。而異步的則是直接返回。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章