GDB调试多进程多线程程序

       各位好久不见哈!最近有点忙,好久没写博客了。今天我想和大家分享一下,用gdb简单调试多进程和多线程程序的代码和方法。

      我们知道gdb是Linux环境下的代码调试工具。使用时,需要在源代码生成时加上-g选项。默认设置下,在调试多进程程序时gdb只会调试主进程。调试的结果会是这样,我以多进程调试来举例:


      但是gdb(>V7.0)支持多进程的分别以及同时调试,换句话说,gdb可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。

    关于多线程多进程调试

  set follow-fork-mode+ [parent|child]                                      ——设定调试对象(默认为parent)

  set detach-on-fork [on|off]                                                     ——设定调试状态(默认值:on)

具体如下表:

follow-fork-mode

detach-on-fork

说明

parent

  on   

 只调试主进程(gdb默认)

parent

 off   

只调试子进程

child

on   

同时调试两个进程,gdb跟主进程,子进程block在fork位置

child

off 

同时调试两个进程,gdb跟子进程,主进程block在fork位置

   info inferiors                                                                        ——查询正在调试的进程

   inferior +进程号                                                                   ——切换调试的进程
   remove+进程号                                                                    ——移动调试的进程

   detach +进程号                                                                    ——删除调试的进程

      常用调试命令(部分)

   gdb + 待调试的可执行文件名                                                ——进入gdb调试

   ctrl+d或者quit                                                                      ——退出gdb调试

   help                                                                                      ——显示帮助

   r                                                                                            ——运行程序到断点处

   s                                                                                            ——进入函数调用

   l                                                                                             ——看到代码  l+行号i  从第i行开始显示

   b                                                                                           ——打断点  b+行号

   Info  b                                                                                   ——查看所有断点

  disable+断点号                                                                      ——关闭断点

  enable+断点号                                                                       ——打开断点

  n                                                                                            ——单步执行(next)

  p                                                                                             ——打印p后所指的内容(print)

  until+行号                                                                              ——跳转到哪一行

  c                                                                                             ——直接运行到下一断点

  bt                                                                                           ——查看堆栈信息

  set var i=11                                                                            ——改变i的值

  finish                                                                                      ——运行完一个函数停下来

  cont                                                                                       ——跳过当前断点继续运行

  jump                                                                                      ——让程序跳到指定行开始调试


      本文以set follow-fork-mode为parent,set detach-on-fork [on|off] 为off进行gdb调试,而进行gdb调试的多进程多线程的源程序如下所示:

gdb.c——多进程程序

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/wait.h>
  4
  5 int main(){
  6     pid_t id = fork();
  7     if(id<0){
  8         perror("fork");
  9         return -1;
 10     }
 11     else if(id == 0){//child
 12         printf("i am a child,id is:%d,my parent id is:%d\n", getpid(),getppi    d());
 13         return 1;
 14     }
 15     else
 16     {
 17         printf("i am parent,id is:%d,my parent id is:%d\n", getpid(),getppid    ());
 18
 19         pid_t ret = waitpid(id, NULL, 0);
 20         if(ret>0){
 21             printf("wait success!\n");
 22         }
 23     }
 24     return 0;
 25 }

gdb1.c——多线程程序


1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<unistd.h>
  4 #include<sys/wait.h>
  5
  6 void* fun(void* arg){
  7     printf("fun:the pthread is %d\n",pthread_self());
  8 }
  9
 10 void* sad(void* arg){
 11     printf("sad:the pthread is %d\n",pthread_self());
 12 }
 13
 14 int main(){
 15      printf("i am main!id:%d,pid:%d\n", getpid(),getppid());
 16      pthread_t first;
 17      pthread_t second;
 18
 19      printf("first pid:%d, ppid:%d\n", getpid(), getppid());
 20      pthread_create(&first, NULL, fun, NULL);
 21      printf("second pid:%d, ppid:%d\n", getpid(), getppid());
 22      pthread_create(&second, NULL, sad, NULL);
 23
 24      pthread_join(first, NULL);
 25      pthread_join(second, NULL);
 26     return 0;
 27 }

Makefile

 1 .PHONY:
  2 all:run run1
  3
  4 run:gdb.c
  5     gcc -o $@ $^ -g -lpthread
  6 run1:gdb1.c
  7     gcc -o $@ $^ -g -lpthread
  8
  9 .PHONY:
 10 clean:
 11     rm -f run run1

直接运行结果

 

  对gdb(多进程程序)进行调试的截图如下:

 

  对gdb1(多线程程序)进行调试的截图如下:

 


       分享如上,望多多交流,如有错误,望交流指正,愿各位学习开心快乐!^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值