gdb启动多进程程序并切换调试进程

前言

gdb是linux环境下调试C/C++程序的强大工具,但是最近在使用gdb启动一个多进程程序的时候总是意外退出,显示信息中包含Detaching after fork from child process 25377.这一句,而用attach命令附加到正在运行的进程却没有问题,因为需要调试启动逻辑的部分代码,所以必须使用gdb启动多进程程序,后来发现可以通过gdb的follow-fork-mode选项来切换进程,达到调试指定进程的目的。

使用方法

set follow-fork-mode [parent|child]

这个命令只要gdb启动程序之后,在运行r命令之前敲入即可,如果不设置默认是parent模式,如果调试的child模式,就需要手动切换,我遇到的问题就是,程序启动使用fork()函数创建出子进程之后就把父进程退出了,gdb默认调试parent进程,也跟着结束了,所以出现了之前所说的Detaching after fork from child process 25377.信息,接下来可以写个简单的例子测试一下。

测试环境

[albert@localhost#20:15:45#/home/albert/gdbtest]$cat /etc/issue
CentOS release 6.3 (Final)
Kernel \r on an \m

[albert@localhost#20:16:25#/home/albert/gdbtest]$gdb --version
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
[albert@localhost#20:16:36#/home/albert/gdbtest]$^C

具体例子

  1. 先写一个简单的多进程程序,模拟我遇到的问题,父进程退出,子进程继续工作
#include <unistd.h>
#include <stdlib.h>

int main ()
{
    pid_t pid; //pid表示fork函数返回的值,会根据不同进程返回不同值
    pid = fork();
    if (pid < 0)
    {
        exit(-1);
    }
    else if (pid == 0) // 子进程返回pid为0
    {
        unsigned int u = 0;
        while(true)
        {
            ++u;
            sleep(1);
        }
    }
    else // 父进程返回pid为子进程的id,大于0
    {
        exit(1);
    }
    return 0;
}
  1. 将代码编译成可执行程序
[albert@localhost#20:04:31#/home/albert/gdbtest]$g++ multiprocess.cpp -o multiprocess
  1. gdb启动程序并运行,其中我只输入了rq两个gdb命令,发现程序运行r之后输出几行信息就退出了
[albert@localhost#20:04:45#/home/albert/gdbtest]$gdb ./multiprocess
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/albert/gdbtest/multiprocess...(no debugging symbols found)...done.
(gdb) r
Starting program: /home/albert/gdbtest/multiprocess
warning: the debug information found in "ld-2.12.so.debug" does not match "ld-linux-x86-64.so.2" (CRC mismatch).
warning: the debug information found in "ld-2.12.so.debug" does not match "ld-linux-x86-64.so.2" (CRC mismatch).
warning: the debug information found in "libm-2.12.so.debug" does not match "libm.so.6" (CRC mismatch).
warning: the debug information found in "libm-2.12.so.debug" does not match "libm.so.6" (CRC mismatch).
warning: the debug information found in "libc-2.12.so.debug" does not match "libc.so.6" (CRC mismatch).
warning: the debug information found in "libc-2.12.so.debug" does not match "libc.so.6" (CRC mismatch).

Detaching after fork from child process 25377.

Program exited with code 01.
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libstdc++-4.4.7-18.el6_9.2.x86_64
(gdb) q
[albert@localhost#20:05:03#/home/albert/gdbtest]
  1. 使用set follow-fork-mode child命令调试子进程,在r之前输入即可,这次发现程序停在了[New process 27522],此时就可以打断点调试了
[albert@localhost#20:23:12#/home/albert/gdbtest]$gdb ./multiprocess
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/albert/gdbtest/multiprocess...(no debugging symbols found)...done.
(gdb) set follow-fork-mode child
(gdb) r
Starting program: /home/albert/gdbtest/multiprocess
warning: the debug information found in "ld-2.12.so.debug" does not match "ld-linux-x86-64.so.2" (CRC mismatch).
warning: the debug information found in "ld-2.12.so.debug" does not match "ld-linux-x86-64.so.2" (CRC mismatch).
warning: the debug information found in "libm-2.12.so.debug" does not match "libm.so.6" (CRC mismatch).
warning: the debug information found in "libm-2.12.so.debug" does not match "libm.so.6" (CRC mismatch).
warning: the debug information found in "libc-2.12.so.debug" does not match "libc.so.6" (CRC mismatch).
warning: the debug information found in "libc-2.12.so.debug" does not match "libc.so.6" (CRC mismatch).
[New process 27522]

^C
Program received signal SIGINT, Interrupt.
[Switching to process 27522]
0x00007ffff7354c30 in __nanosleep_nocancel () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libstdc++-4.4.7-18.el6_9.2.x86_64
(gdb) b multiprocess.cpp:17

总结

  1. gdb调试多进程程序时使用set follow-fork-mode [parent|child]命令
  2. 默认调试parent进程,想调试child进程,使用set follow-fork-mode child命令切换
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertS

常来“玩”啊~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值