//a)编译时g++ 要带这个 -g选项;
//b)su进入root权限,然后gdb nginx调试
//c)gdb缺省调试主进程,但是gdb 7.0以上版本可以调试子进程【我们需要调试子进程,因为干活的是worker process是子进程】;
//命令 行下 :gdb -v看版本
//d)为了让gdb支持多进程调试,要设置一下 follow-fork-mode选项 ,这是个调试多进程的开关;
//取值可以是parent[主] /child[子] ,我们这里需要设置成child才能调试worker process子进程;
//查看follow-fork-mode: 在gdb下输入show follow-fork-mode
//输入 set follow-fork-mode child
//(e) 还有个选项 detach-on-fork, 取值为 on/off,默认是on【表示只调试父进程或者子进程其中的一个】
//调试是父进程还是子进程,由上边的 follow-fork-mode选项说了算;
//如果detach-on-fork = off,就表示父子都可以调试,调试一个进程时,另外一个进程会被暂停;
//查看 show detach-on-fork
//输入set show detach-on-fork off ,如果设置为off并且 follow-fork-mode选项为parent,那么fork()后的子进程并不运行,而是处于暂停状态;
//(f)b logic/ngx_c_slogic.cxx:198 (设置断点)
//(g)run 运行程序运行到断点;
//(h)print…打印变量值。这些调试手段,大家自己百度学习;
//(i)c命令,继续运行
也可以通过如下方式调试:
1)查看进程号
2)gdb attach 进程号 ----------------- attach到已启动的进程上
3)(gdb) stop ------------------ 先暂停那个进程,然后设置一些断点和一些watch
4)(gdb) b file.cpp:212 ------------------- 设置断点(在file.cpp文件的212行处设置断点)
3)c(continue)让程序继续执行
4)程序挂了,查看堆栈信息
5)bt full