IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

使用GDB调试多进程程序

架构研究室 2010-01-08 12:09:23 累计浏览 6,364 次
本机暂存

    在学习Nginx源码的过程中

    碰到一个问题

    使用GDB调试Nginx的时候

    每次在Nginx主程序启动master之后

    主进程就被deattache了.然后整个GDB退出

    这样我们就没法看到最主要的事情的经过了.

    因为主要的进程管理,事件处理等等事情,

    都是发生在fork出来的master以及再后面的worker进程中的

    好在IBM developer works上一直有绝好的文章

    这篇使用 GDB 调试多进程程序就是专门讲述GDB调试多进程程序的三个方法的

    1.使用follow-fork-mode和set detach-on-fork连用来自动跳入fork后的进程中

    这个方法在新版本的内核中都可以使用.

    在gdb中使用者两个指令

    set follow-fork-mode [parent|child]

    parent: fork之后继续调试父进程,子进程不受影响。

    child: fork之后调试子进程,父进程不受影响。

    set detach-on-fork [on|off]

    on: 断开调试follow-fork-mode指定的进程。

    off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。

    一般是进gdb之后

    set follow-fork-mode child

    set detach-on-fork off

    这样就可以满足调试子进程的要求了

    2.先在环境中使用ps以及pstree确定需要调试子进程的pid

    然后在gdb中使用attach [pid]来进入需要调试的子进程

    这个方法需要解决进入子进程的时候无法确定运行到什么程度的问题

    需要修改子进程的源码,在开始设置个标志位或者标志文件,

    gdb调试之后修改此标志位让子进程执行起来

    3.在主程序调用子程序的地方替换成sh,sh里面用gdb去调用子进程的可执行程序

    这个方法超麻烦,需要xwindow,而且只能在用exec启用子进程的程序使用

    所以此方法虽然可行,但是制约太多.不推荐.

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,164)
  2. 搜狐闪电邮箱的 Nginx/Postfix 使用模式 (累计阅读 33,895)
  3. 记录一个软中断问题 (累计阅读 16,954)
  4. 解析nginx负载均衡 (累计阅读 16,622)
  5. 调试工具之GDB (累计阅读 14,829)
  6. gdb的基本工作原理是什么? (累计阅读 11,682)
  7. server日志的路径分析 (累计阅读 11,240)
  8. Nginx模块开发入门 (累计阅读 11,170)
  9. 检查nginx配置,重载配置以及重启的方法 (累计阅读 10,896)
  10. 在vim(gvim)中运行终端(对,你没有看错,我也没有写反) (累计阅读 10,744)