本文的测试环境:

Win7+虚拟机VMWareVMware-workstation-full-7.1.4-385536+Ubuntu12.04

Nginx-1.4.0

要想有效的研究Nginx源码,必须要动手调试,GDB就是有用的利器。下面简要介绍用GDB调试Nginx的一个小例子。

本文完成了这样的工作:跟踪worker子进程,观察worker子进程阻塞在何处。然后利用wget向nginx发送一个消息,观察整个消息处理过程。

关于GDB调试Nginx,有一篇博文讲的很不错,可以参考下:利用GDB调试Nginx。这篇博客的作者Lenky即《深入剖析Nginx》的作者。这本书讲的也不错,正在研究中。

我们以默认的Nginx配置来进行调试,即master模式。

首先我们切换工作目录至:.../nginx-1.4.-/objs/,然后在终端中启动GDB调试器:sudo gdb -q -tui(q选项是以安静模式启动,不显示GDB版本等信息。tui选项可以显示代码界面)

然后在GDB中启动nginx:shell ./nginx

启动之后,可以查看当前nginx中的进程号:shell pidof nginx

也可以在另一个终端中通过下列命令来查看:

我们可以用attach命令来跟踪子进程:

我们知道,子进程即worker进程在运行后会停留在epoll_wait处等待相应的事件发生,而这个函数调用被封装在ngx_process_events_and_timers 中。于是我们在这个函数出设置一个断点:b ngx_process_events_and_timers

然后采用命令c,使得nginx一直运行,直到遇到第一个断点:

我们知道处理事件的方法是ngx_process_events,于是我们跟踪进去这个函数:

s命令跟踪进函数里面:

我们用n命令继续向下执行,当执行到epoll_wait函数的时候,发现进程停留在这里,不能在向下执行。这就验证了:worker子进程阻塞在epoll_wait函数调用处。

这时,我们在另一个终端执行下列命令,以向nginx发送消息:wget www.web_test2.com(预先在etc/hosts文件中加入下列行:192.168.2.129 www.web_test2.com.其中192.168.2.129 是本机IP)

终端显示,请求已经发送,正在等待回应。

在gdb中用n命令继续执行,直到跳出ngx_process_events函数接口。

其实我们可以通过查看栈帧来看函数调用的整个过程:bt

继续执行,最后wget命令的那个终端会收到服务器端的响应:

参考资料:

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

Nginx学习之十四-GDB调试Nginx初试的更多相关文章

  1. nginx模块_使用gdb调试nginx源码

    工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段. ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正. 熟悉gdb的使用 这里 ...

  2. nginx源码分析--使用GDB调试(strace、 pstack )

    nginx源码分析--使用GDB调试(strace.  pstack ) http://blog.csdn.net/scdxmoe/article/details/49070577

  3. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  4. Linux学习之十四、管线命令

    Linux学习之十四.管线命令 地址:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php

  5. 风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击

    风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击 XSS钓鱼攻击 HTTP Basic Authentication认证 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候 ...

  6. [转] linux学习第四十四篇:Nginx安装,Nginx默认虚拟主机,Nginx域名重定向

    Nginx安装 进入存放源码包的目录: cd /usr/local/src 下载源码包: wget http://nginx.org/download/nginx-1.12.1.tar.gz 解压: ...

  7. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  8. Nginx学习笔记(四) 源码分析&socket/UDP/shmem

    源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_socket.h&Ngx_s ...

  9. Nginx详解十四:Nginx场景实践篇之代理服务

    代理的作用 Nginx代理 正向代理 反向代理 正向代理和反向代理的区别:代理的对象不一样 正向代理代理的对象是客户端,反向代理代理的对象是服务端 反向代理: 配置语法:proxy_pass URL; ...

随机推荐

  1. uploadify.js

    基于uploadify.js实现多文件上传和上传进度条的显示 uploadify是JQuery的一个插件,主要实现文件的异步上传功能,可以自定义文件大小限制.文件类型.是否自动上传等属性,可以显示上传 ...

  2. HTTP2协议之HPACK--之头部压缩规范介绍

    接下来打算把HTTP2协议的头部压缩算法给翻译下,敬请等候. HPACK - Header Compression for HTTP/2 HPACK:HTTP/2头部压缩 概要说明 这个规范定义了HP ...

  3. 《Shell十三问》笔记(下)

    继续开始shell十三问中11-13问和后续补充的笔记,加油! (14)输入重定向与输出重定向 “>”是标准输出重定向,可以把输出结果送入文件 “<”是标准输入重定向,可以重新指定文件的内 ...

  4. 基于jQuery的上下无缝滚动应用(单行或多行)

    工作中遇到的一个js代码,现在对.trigger('mouseleave'),仍一知半解... <script>$(function(){//单行应用var _wrap=$('ul.lin ...

  5. 《互联网初创企业password》书评

    今天试用了一下<互联网初创企业password>这本书.我觉得这本书开始的很真实,从学校刚毕业那会儿.它是生命,他们的牛b时间,一直想做点什么来证明自己.具体地,并且现在是在最好的时候.互 ...

  6. 手机新闻网站,掌上移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发

    我们坐在地铁,经常来查看新浪手机新闻,腾讯新闻.或者刷微信看新闻更多功能.你有没有想过如何实现这些目标.移动互联网,更活泼. 因为HTML5到,jQuery Moblie到.今天我用jqm为了给你一个 ...

  7. windows下grunt安装提示不成功

    在电脑按了node.js之后,在cmd中 输入 npm install -g grunt-cli 注意啦 不是 npm install -g grunt-cli 中间多了一个空格就安装不成功了,这个空 ...

  8. Mac OS X下环境搭建 Sublime Text 2 环境变量配置 开发工具配置Golang (Go语言)

    Golang (Go语言) Mac OS X下环境搭建 环境变量配置 开发工具配置 Sublime Text 2 一.安装Golang的SDK 在官网http://golang.org/ 直接下载安装 ...

  9. Ubuntu下安装Intel Fortran编译器(ifort)

    Intel Fortan Compiler简称ifort, Windows下的ifort是收费的,但是Linux系统下提供免费的ifort,可以在下面的链接中下载需要的版本(必须先注册,随后会收到官网 ...

  10. C#自带组件

    C#自带组件 在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 贯穿所有的日志系统 日志系统,往往是贯穿一个程序的所有代码的; ...