利用gdb调试nginx

利用gdb调试nginx

1. 打开nginx调试
    首先修改/auto/cc/conf文件,将ngx_compile_opt="-c"改为ngx_compile_opt="-c -g".
    打开debug模式进行编译,简单操作如下:
             sudo ./configure –with-debug
             sudo make
             sudo make install
   
2. 利用gdb调试nginx
 

利用gdb调试nginx和利用gdb调试其它程序没有两样,不过nginx可以是daemon程序,也可以以多进程运行,因此利用gdb调试和

平常会有些许不一样。当然,我们可以选择将nginx设置为非daemon模式并以单进程运行,而这需做如下设置即可:
daemon off;
master_process off;

这是第一种情况:
这种设置下的nginx在gdb下调试很普通,过程可以[iii]是这样:
执行命令:
lenky@lenky-desktop:/usr/local/nginx/sbin$ sudo gdb ./nginx
当前目录是在/usr/local/nginx/sbin,该目录下有执行程序nginx,上条命令也就是用gdb来开始调试nginx,进入gdb命令行,直接输入r即可执行nginx:
(gdb) r
Starting program: /usr/local/nginx/sbin/nginx
src/core/ngx_conf_file.c 1163 : 1000000
===============================
ngx_timer_resolution 1000000
因为nginx以前台形式运行,键盘输入被nginx接管,此时无法输入gdb命令,因此需要按Ctrl+C退到gdb命令行模式,而nginx被中断暂停在__kernel_vsyscall调用里,输入bt命令可以查看到调用堆栈信息:
(gdb) r
Starting program: /usr/local/nginx/sbin/nginx
src/core/ngx_conf_file.c 1163 : 1000000
===============================
ngx_timer_resolution 1000000
^C
Program received signal SIGINT, Interrupt.
0xb7f29430 in __kernel_vsyscall ()
(gdb) bt
#0  0xb7f29430 in __kernel_vsyscall ()
#1  0xb7e081a8 in epoll_wait () from /lib/tls/i686/cmov/libc.so.6
#2  0x08073ea3 in ngx_epoll_process_events (cycle=0x860ad60, timer=4294967295,
flags=0) at src/event/modules/ngx_epoll_module.c:405
#3  0x080668ee in ngx_process_events_and_timers (cycle=0x860ad60)
at src/event/ngx_event.c:253
#4  0×08071618 in ngx_single_process_cycle (cycle=0x860ad60)
at src/os/unix/ngx_process_cycle.c:283
#5  0x0804a926 in main (argc=1, argv=0xbfd2ae44) at src/core/nginx.c:372
(gdb)
好,来给nginx设置断点,这很简单,比如这里给函数ngx_process_events_and_timers设置个断点,再输入命令c继续执行nginx:
#4  0×08071618 in ngx_single_process_cycle (cycle=0x860ad60)
at src/os/unix/ngx_process_cycle.c:283
#5  0x0804a926 in main (argc=1, argv=0xbfd2ae44) at src/core/nginx.c:372
(gdb) b ngx_process_events_and_timers
Breakpoint 1 at 0x80667d6: file src/event/ngx_event.c, line 200.
(gdb) c
Continuing.
Breakpoint 1, ngx_process_events_and_timers (cycle=0x860ad60)
at src/event/ngx_event.c:200
200  {
(gdb)
结果我这里gdb马上提示断点中断,这是因为恰好调到这个函数而已,也许在你那并不会马上中断,从而gdb就一直停在Continuing后面,此时我们就要主动去触发事件(或者等待,时间可能很久,根据你的nginx设置)使得nginx调用这个函数,比如利用浏览器去访问nginx监听的站点,使得nginx有事件发生。
断点中断后,利用s、c等gdb常规命令进行我们的调试,跟踪,这些无需多说:
200  {
(gdb) s
__cyg_profile_func_enter (this=0x80667d0, call=0×8071618)
at src/core/my_debug.c:65
warning: Source file is more recent than executable.
65      my_debug_print(“Enter\n%p\n%p\n”, call, this);
(gdb)
66    }
(gdb) c
Continuing.
ngx_timer_resolution 1000000


参考:

1. http://lenky.info/2011/09/10/%E5%88%A9%E7%94%A8gdb%E8%B0%83%E8%AF%95nginx/

2. http://www.cnblogs.com/yjf512/archive/2012/05/10/2494635.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值