使用GDB调试nginx

gdb是linux上调试应用程序的首选。在进行nginx的调试过程中,首先需要修改Makefile文件。

vi objs/Makefile
#增加 -O0 和 -g 选项; -O0代表不进行优化,-g代表调试模式
CFLAGS =  -pipe -W -Wall -Wpointer-arith -Wno-unused-parameter -g -O0


一、设置nginx为前台单进程模式

修改配置文件,增加如下两句:

daemon off;  #关闭守护进程,使之在前台运行
master_process off;  #关闭主进程,使只有一个进程

这就可以了,启动调试。

gdb nginx 
run

说明:在这个过程中,因为nginx是前台运行,占用了键盘,因此gdb的命令无法输入。需要输入Ctrl+C,暂停nginx,然后设置断点等一系列操作,之后键入 c 则 nginx就会继续运行了。

 

二、设置nginx为后台单进程模式

修改配置文件为:

daemon on;
master_process off;

这样就打开了nginx后台运行的模式,启动gdb调试发现如下:

Reading symbols from /usr/local/nginx/sbin/nginx...done.
(gdb) run
Starting program: /usr/local/nginx/sbin/nginx 
[Thread debugging using libthread_db enabled]

Program exited normally.
(gdb)

难道进程真的退出了吗?没有,退出的只是nginx的父进程,而fork出来的进程gdb没有跟到,所以出现了这个情况。这种情况下,gdb是有自己的策略的。命令如下:( 其实这一点我还是比较困惑的! )

(gdb) shell pidof nginx
5692
(gdb) set follow-fork-mode child  #设置调试子进程,父进程不受影响(相对应的是parent)
(gdb) b ngx_http_upstream_cleanup
Breakpoint 1 at 0x43db0b: file src/http/ngx_http_upstream.c, line 2951.



posted @ 2017-01-10 23:24  Andy.gbhu  阅读(1624)  评论(0编辑  收藏  举报