IT技术博客大学习 共学习 共进步

使用GDB调试多进程程序

架构研究室 2010-01-08 12:09:23 浏览 6,243 次

    在学习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. 调试工具之GDB (阅读 14,703)
  2. Oracle MTS模式下 进程地址与会话信息 (阅读 14,187)
  3. Linux内存点滴 用户进程内存空间 (阅读 12,946)
  4. gdb的基本工作原理是什么? (阅读 11,523)
  5. 深入理解Nginx之调试优化技巧 (阅读 8,104)
  6. Linux上进程的表示以及入门 (阅读 7,642)
  7. 使用gdb调试运行时的程序小技巧 (阅读 7,125)
  8. Linux下进程绑定多CPU运行 (阅读 7,104)
  9. 分析进程内存分配情况,解决程序性能问题 (阅读 6,684)
  10. GDB中应该知道的几个调试方法 (阅读 6,483)