gdb是Linux系统上调试程序的利刃。为了gdb 调试nginx ,在编译时,需要选择--with-debug选项,开启debug模式,其次需要修改 Makefile文件。
vi objs/Makefile
增加 -O0 和 -g 选项;-O0代表不进行优化,-g代表调试模式
CFLAGS= -pipe -W -wall -Wpointer-arith -Wno-unused-parameter -g -O0
一、设置nginx为前台worker单进程模式
修改配置文件,在全局区增加如下:
daemon off; #关闭守护进程,使之在前台工作
master_process off; #关闭主进程,时只有worker进程工作
error_log logs/error.log debug; #记录debuug 调试信息
这就可以了,启动调试。
gdb ./nginx
设置断点、运行
二、设置nginx为前台master进程调试模式
修改配置文件,在全局区增加如下:
daemon off; #关闭守护进程,使之在前台工作
master_process on; #关闭主进程,时只有worker进程工作
error_log logs/error.log debug; #记录debuug 调试信息
这就可以了,启动调试。
gdb ./nginx
三、设置nginx为后台worker单进程模式
修改配置文件,在全局区增加如下:
daemon on; #关闭守护进程,使之在前台工作
master_process on; #关闭主进程,时只有worker进程工作
error_log logs/error.log debug; #记录debuug 调试信息
这样就打开了nginx后台运行的模式,启动gdb调试发现如下:
Reading symboles from /usr/local/nginx/sbin/nginx...done.
(gdb) run
Starting program:/usr/local/nginx/sbin/nginx
[Thread debugging using libthread_db enable]
Program exited normally.
(gdb)
这种情况真正退出的只是nginx的父进程,而fork出来的进程gdb 没有跟到,所以出现了这个情况。这种情况下,可以进行如下操作:
(gdb) set follow-fork-mode child #设置调试子进程,父进程不受影响(相对应的是parent)
(gdb) b ngx_process_events_and_timers
如果想打印中间的某个变量可以用 :p 变量
gdb日志保存在:
error_log logs/error.log debug;