GDB调试fork+exec创建的子进程的方法

来源:互联网 发布:淘宝外卖会员卡怎么用 编辑:程序博客网 时间:2024/05/29 09:25



多进程是Linux编程中一个很重要的内容,典型的例子就是守护进程(daemon)。有关守护进程的定义和编程规范,请参考:

http://blog.csdn.net/tuzhutuzhu/article/details/19092211

最常见的多进程的形式如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. pid = fork();  
  2. if (pid < 0) {  // fork failed  
  3.     printf("fork error\n");  
  4.     exit(1);  
  5. else if (pid > 0) { // parent process  
  6.     // command  
  7. else { // child process  
  8.     // command  
  9. }  
对于这种类型的多进程程序的调试,在gdb中使用选项follow-fork-mode即可。

使用:set follow-fork-mode child,即可追踪子进程。而set follow-fork-mode parent可调试父进程。

还有一种多进程程序的形式为:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. pid = fork();  
  2. if (pid < 0) {  // fork failed  
  3.     printf("fork error\n");  
  4.     exit(1);  
  5. else if (pid > 0) { // parent process  
  6.     // command  
  7. else { // child process  
  8.     execv("a.out", NULL);  
  9. }  
这种程序的调试则要困难一些,下面我们通过一个实际的例子来看一下它的调试方法。

当前有两个代码test.c和child.c,其中test.c中的子进程通过execv调用child.c。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. test.c  
  2. #include <stdlib.h>  
  3. #include <stdio.h>  
  4. #include <unistd.h>  
  5.   
  6. int main()  
  7. {  
  8.     int ret = 0;  
  9.     ret = fork();  
  10.     if (ret == 0) {  
  11.          execv("a.out", NULL);  //a.out是child.c编译成的可执行文件  
  12.     }  
  13.   
  14.     return 0;  
  15. }  
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. child.c  
  2. #include <stdlib.h>  
  3. #include <stdio.h>  
  4. #include <unistd.h>  
  5.   
  6. int main()  
  7. {  
  8.     my_print();  
  9.     return 0;  
  10. }  
  11.   
  12. int my_print()  
  13. {  
  14.     printf("hello world\n");  
  15.     return 0;  
  16. }  

使用gdb调试的详细过程如下所示:


上面的例子中,最重要的操作时catch exec这个事件。捕获到exec这个事件之后再往子进程的程序中打一个断点,然后执行continue操作。可以看到,此时程序就会进入到exec调用的子进程中了。

网上介绍gdb调试fork+exec创建的子进程的方法有不少,实际使用之后觉得,还是这种方法操作起来较为简洁明了。大家如果有什么更好的方法,请一定告诉我。


后记:

本文主要介绍的是使用gdb调试fork+exec创建的子进程的方法。虽然方法是知道了,但是在实际的工作中,这种方法的实用性并不是十分的高。因为上述方法有很大的局限性:这种方法只能用在父进程中仅有一个exec的程序中。

当程序中存在多个fork+exec,使用上述的方法只能进入到第一个子进程中!!因此,想要调试其他的子进程就不行了。然而,对于任意一个子进程都可以自由的进行调试,才是我的真正目标。我也会继续调查gdb对于fork+exec创建的多个子进程的调试方法,一旦有进展将会及时和大家分享
0 0
原创粉丝点击