使用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.