GDB调试Nginx

gdb调试nginx笔记

网上说要在ccms-nginx/NGINX/NGINX-1.6.2/develop/auto/cc/conf文件中ngx_compile_opt="-c -g"加上-g才有gdb信息。

方法一:启动nginx后attach到进程上

启动源码中的nginx 为了gdb调试,需要启动源码目录下的nginx, 进入编译nginx的源码目录ccms-nginx/NGINX/NGINX-1.6.2/develop $ objs/nginx -c /home/userkkk/hls/nginx.conf 如果是先启动nginx,再gdb attach到进程上,可以指定配置文件启动 如果是以gdb nginx启动nginx,则不能指定配置文件,还是使用默认的/usr/local/sms/conf/nginx.conf

attach到nginx worker进程 ps -ef | grep nginx查看nginx的master和worker进程号, 一般和推流播放相关的任务都是worker进程执行的,比如worker进程号是10624 在源码的develop目录中执行 $ gdb objs/nginx 10624 或者在任意目录执行: $ gdb -p 10624$ gdb attach 10624 看到如下信息:

Reading symbols from /home/user/ccms-nginx/NGINX/NGINX-1.6.2/develop/objs/nginx...done.
Attaching to program: /home/user/ccms-nginx/NGINX/NGINX-1.6.2/develop/objs/nginx, process 10624

说明attach成功,后面的几个no debugging symbols found可以不用管它

attach后进程就被暂停了, 可以先插入几个断点,然后输入gdb命令c(continue)继续执行

方法二:在gdb中启动nginx

(1) 在任意位置启动gdb: $ gdb

(2) 在gdb中用file命令指定nginx可执行文件:

(gdb)file /home/user/ccms-nginx/NGINX/NGINX-1.6.2/develop/objs/nginx
Reading symbols from /home/user/ccms-nginx/NGINX/NGINX-1.6.2/develop/objs/nginx...done.

(3) 在gdb中set args指定启动nginx的参数(即配置文件)

(gdb) set args -c /home/user/conf/nginx.conf

(4) 设定断点

(gdb) b ngx_http_core_module.c:2734
Breakpoint 1 at 0x4713c5: file src/http/ngx_http_core_module.c, line 2734.

(5) run程序 (gdb) r

gdb内打印变量提示<value optimized out>

这是因为gcc优化导致,我们可以加上CFLAGS="-g -O0"选项强制禁用gcc的编译优化。 如何把“-g -O0”应用在nginx上可以有三种方法: 1、在进行configure配置时,按如下方式执行: # CFLAGS="-g -O0" ./configure

2、直接修改文件objs/Makefile,在其中给CFLAGS参数其加上“-g -O0”:

CFLAGS = -g -O0  -I../../../NGINX-RTMP/nginx-rtmp-module-master/develop -I../../../MODULES/develop/ngx_http_hls_tshift -I../../../MODULES/develop/ngx_http_live -I../../../MOD     ULES/develop/ngx_http_billing -DNDK_SET_VAR

3、在执行make时,按如下方式执行: # make CFLAGS="-g -O0"