【gdb】调试子进程

调试子进程

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

follow-fork-mode detach-on-fork 说明
parent   on 只调试主进程( GDB 默认)
child on 只调试子进程
parent off  同时调试两个进程, gdb 跟主进程, 子进程 block 在 fork 位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置

 

1. 例子:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
  pid_t pid;

  pid = fork();
  if (pid < 0)
  {
    exit(1);
  }
  else if (pid > 0)
  {
    exit(0);
  }
  printf("hello world\n");
  return 0;
}

在调试多进程程序时,gdb默认会追踪父进程。例如:

(gdb) start
Temporary breakpoint 1 at 0x40055c: file a.c, line 8.
Starting program: /data2/home/nanxiao/a

Temporary breakpoint 1, main () at a.c:8
8               pid = fork();
(gdb) n
9               if (pid < 0)
(gdb) hello world

13              else if (pid > 0)
(gdb)
15                      exit(0);
(gdb)
[Inferior 1 (process 12786) exited normally]

可以看到程序执行到第15行:父进程退出。如果要调试子进程,要使用如下命令:“set follow-fork-mode child”,例如:

(gdb) set follow-fork-mode child
(gdb) start
Temporary breakpoint 1 at 0x40055c: file a.c, line 8.
Starting program: /data2/home/nanxiao/a

Temporary breakpoint 1, main () at a.c:8
8               pid = fork();
(gdb) n
[New process 12241]
[Switching to process 12241]
9               if (pid < 0)
(gdb)
13              else if (pid > 0)
(gdb)
17              printf("hello world\n");
(gdb)
hello world
18              return 0;

可以看到程序执行到第17行:子进程打印“hello world”。

这个命令目前Linux支持,其它很多操作系统都不支持,使用时请注意

 

参考资料

1. gdb手册

2. 调试子进程

3. gdb调试多进程和多线程命令

posted @ 2023-10-15 20:26  苏格拉底的落泪  阅读(116)  评论(0编辑  收藏  举报