gdb调试 fork程序 设置跟踪

来源:互联网 发布:java 架构师 高并发 编辑:程序博客网 时间:2024/06/16 16:28

使用gdb调试的时候,gdb只能跟踪一个进程。

 

可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或子进程。

默认情况下gdb是跟踪父进程的。

 

set follow-fork-mode child命令设置gdbfork之后跟踪子进程。

set follow-fork-mode parent设置跟踪父进程。

 

注意:一定要在fork函数调用之前设置。

 


程序测试:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main(void)

{

   pid_t pid;

   printf("你是我的削苹果\n");

   

   pid = fork();

   if(pid==-1){

      perror("fork error");

      exit(1);

   }else if(pid == 0){

      printf("child is here. pid = %u,ppid = %u\n", getpid(), getppid());

   }else{

      printf("parent is here. pid = %u,ppid = %u\n", getpid(), getppid());

      sleep(1);

   }

   

   return 0;

}

 

编译、调试:

yu@ubuntu:~/cplusplus/fork创建进程$ gcc fork.c -o fork -g

yu@ubuntu:~/cplusplus/fork创建进程$ gdb fork

 

开始调试,设置跟踪子进程:

(gdb)set follow-fork-mode child

(gdb)start

Temporarybreakpoint 1 at 0x40071f: file fork.c, line 7.

Starting program: /home/yu/cplusplus/fork创建进程/fork

 

Temporary breakpoint 1, main () at fork.c:7

7     printf("你是我的削苹果\n");

(gdb)n

你是我的削苹果

9     pid = fork();

(gdb)n

parentis here. pid = 2170, ppid = 2168

[Newprocess 2174]

[Switching to process 2174]    //此处已经转向跟踪子进程程序

main() at fork.c:10

10    if(pid==-1){

(gdb)n

13    }else if(pid == 0){

(gdb)n

14        printf("child is here. pid = %u,ppid = %u\n", getpid(), getppid());

(gdb)c

Continuing.

child is here. pid = 2174, ppid = 1

[Inferior2 (process 2174) exited normally]

0 0
原创粉丝点击