在学习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启用子进程的程序使用
所以此方法虽然可行,但是制约太多.不推荐.