GDB 调试多进程

转自:http://blog.csdn.net/chn89/article/details/7098823


这位IBMer提出三种调试方式,很是靠谱。http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/。鉴于本人的嵌入式背景,多数不太适合采用VNC,于是乎,就举例说明前两种方法吧。待调试代码

[cpp]  view plain copy
  1.  1 #include <stdlib.h>  
  2.  2 #include <unistd.h>  
  3.  3   
  4.  4 int main(){  
  5.  5     pid_t pid;  
  6.  6     int status , i = 9;  
  7.  7   
  8.  8     printf("Now going to fork\n");  
  9.  9   
  10. 10     pid = fork();  
  11. 11     if(pid<0){  
  12. 12         printf("fork error\n");  
  13. 13         return -1;  
  14. 14     }  
  15. 15     else if( pid>0 ){  
  16. 16         wait(&status);  
  17. 17         printf("return %d\n",WEXITSTATUS(status));  
  18. 18         exit(0);  
  19. 19     }  
  20. 20     else {  
  21. 21         while(i-->0){  
  22. 22             printf("loop %d\n",i);  
  23. 23             sleep(2);  
  24. 24         }  
  25. 25         exit(3);  
  26. 26         }  
  27. 27   
  28. 28    
  29. 29 }  

方法1:
   编译 gcc -g multi_proc.c
   加载 gdb a.out 

[cpp]  view plain copy
  1. (gdb) set follow-fork-mode child   
  2. (gdb) b 23  
  3. (gdb) r  
  4. Starting program: /home/XXX/test/a.out   
  5. Now going to fork  
  6. [New process 30427]  
  7. [Switching to process 30427]  
  8.   
  9. Breakpoint 1, main () at multi_proc.c:22  
  10. 22              printf("loop %d\n",i);  
  11. Missing separate debuginfos, use: debuginfo-install glibc-2.13-2.i686  
  12. (gdb) c  
  13. Continuing.  
  14. loop 8  

于是就可以正常调试子进程了。


方法2 :
对于方案1,如果进程继承级别比较多,调试起来比较麻烦,而且还限定了GDB必须为高版本。当然现在的GDB版本都是满足的。方案2的精髓就是attach子进程,如果需要让子进程在被attach之前不做任何操作,可以采用条件触发的方法。其中一个方案可以采用下文。

[cpp]  view plain copy
  1. while(1){  
  2.     if(file exist){  
  3.         some thing realy do;  
  4.         break;    
  5.     }  
  6.     else{  
  7.         sleep(1);  
  8.     }  
  9. }  

在attach进程之后,touch file,进程才真正执行。

调试步骤,打开一个console 

[cpp]  view plain copy
  1. [XXX@localhost test]$ ./a.out   
  2. Now going to fork  
  3. child pid = 31803  

再打开一个cnsole 

[cpp]  view plain copy
  1. gdb a.out 31803  
  2. (gdb) bt  
  3. #0  0x00544416 in __kernel_vsyscall ()  
  4. #1  0x00bf1060 in __nanosleep_nocancel () from /lib/libc.so.6  
  5. #2  0x00bf0ea4 in sleep () from /lib/libc.so.6  
  6. #3  0x08048563 in main () at multi_proc.c:23  
  7. (gdb) l 23  
  8. 19          exit(0);  
  9. 20      }  
  10. 21      else {  
  11. 22          while(i-->0){  
  12. 23              printf("loop %d\n",i);  
  13. 24              sleep(4);  
  14. 25          }  
  15. 26          exit(3);  
  16. 27          }  
  17. 28    
  18. (gdb)   

结合bt命令和第24行的源代码,说明进程睡在这里呢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值