Chinaunix首页 | 论坛 | 博客
  • 博客访问: 494016
  • 博文数量: 112
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 662
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-20 07:22
个人简介

一步一个脚印

文章分类

全部博文(112)

文章存档

2019年(2)

2017年(2)

2016年(2)

2015年(6)

2014年(35)

2013年(65)

分类: 服务器与存储

2014-02-21 17:34:23

    使用gdb调试跟踪nginx的方法与跟踪普通的方法不同。调试的方法是
1.开启nginx,此时nginx的进程已经处于后台运行。
2. gdb -p +worker进程的pid 可以调试worker进程,当然也可以利用这种方法调试他的父进程,但是父进程并没有真正的处理实际的业务。
3. 为这个进程设置断点。
可以发现,nginx的master进程阻塞在sigsuspend 信号上,估计是为了平滑升级的时候使用。


当调试worker进程的时候,设一个端点,发现当没有请求的时候,此时worker进程处于epoll_wait状态,这个跟HAproxy一样,程序阻塞在那里。
可以看出ngx_worker_process_cycle是worker进程处理的核心函数。

ngx_process_events_and_timers 在处理完请求之后,会调用ngx_event_expire_timers() 函数,并找到定时器中的最小的时间,并观察是否这个时间已经超过了当前时间,也就是定时器是否过期,如果过期,那么将这个事件删除,并调用过期时该event的回调函数handler。
ngx_http_keepalive_handler 这个handler函数,会判断这个请求是否过期,如果过期,那么直接关闭这个连接。

点击(此处)折叠或打开

  1. if (rev->timedout || c->close) {
  2.         ngx_http_close_connection(c);
  3.         return;
  4.     }
当调试的时候出现:value optimized out,有些变量gdb调试看不到,可以通过在objs的目录下的Makefile更改成-O0,然后重新编译即可。

阅读(1027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~