本文的测试环境:

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调试

    在学习优秀的源代码时是少不了源码的跟踪与调试,它不仅是我们解决程序bug的有效途径,也是我们理解.学习优秀源码的有效途径. 本文主要介绍一些源码调试的方法,并结合Nginx源码进行示例. 1,利用GD ...

  2. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  3. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  4. python学习[第十四篇] 文件的输入与输出

    python学习[第十四篇] 文件的输入与输出 标准文件类型 一般来说只要程序一执行,就会访问3个文件: 标准输入(键盘) stdin 标准输出(显示器缓冲区) stdout 默认输出到屏幕 标准错误 ...

  5. 花书+吴恩达深度学习(十四)卷积神经网络 CNN 之经典案例(LetNet-5, AlexNet, VGG-16, ResNet, Inception Network)

    目录 0. 前言 1. LeNet-5 2. AlexNet 3. VGG-16 4. ResNet 残差网络 5. Inception Network 如果这篇文章对你有一点小小的帮助,请给个关注, ...

  6. JavaScript学习(十四)—元素节点关系和特殊节点

    JavaScript学习(十四)-元素节点关系和特殊节点 一.元素节点 (1).parentElement: 获取某元素的父元素,它和parentNode的区别是parentElement获取到的值时 ...

  7. Nginx学习笔记3:Shell脚本检测Nginx服务状态

    前言 nginx 服务启动后,我们需要对其服务状态进行监控,今天学习过程中了解到一段非常有用的小脚本,不仅可以监控Nginx,也可以用来监控其他服务 脚本 A=`ps -C nginx –no-hea ...

  8. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  9. C++语言学习(十四)——C++类成员函数调用分析

    C++语言学习(十四)--C++类成员函数调用分析 一.C++成员函数 1.C++成员函数的编译 C++中的函数在编译时会根据命名空间.类.参数签名等信息进行重新命名,形成新的函数名.函数重命名的过程 ...

最新文章

  1. spring security之httpSecurity使用示例
  2. GetCurrentProcessID、OpenProcessToken、LookupPrivilegeValue、AdjustTokenPrivileges
  3. Linux学习-仅执行一次的工作排程
  4. javascript关键字_让我们揭开JavaScript的“ new”关键字的神秘面纱
  5. 鬼子进村(洛谷 1503)
  6. element ui实现动态显示textarea剩余字数
  7. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_8_File类遍历(文件夹)目录功能...
  8. RTL8305NB傻瓜式交换机无法工作
  9. cfe刷机教程 斐讯k3_2019斐讯K3全版本免拆机免降级刷机教程
  10. COMSOL案例内容,有需要的了解下!
  11. 高通WLAN驱动分析
  12. 计算机高一教案,《计算机系统的基本组成》高一信息技术课教案
  13. 获取select选中的值php,js如何获取select标签选中的值
  14. 台式计算机调整显示亮度,台式电脑显示器屏幕亮度怎么调节?
  15. [ 高斯消元 二分图最大匹配 ] [ HEOI2013 ] BZOJ3168 钙铁锌硒维生素
  16. Bert入门:使用Bert运行MRPC的demo成功案例
  17. 两电脑使用网线连接传文件方法
  18. 使用ShellJS提升你的开发效率(一)
  19. SitePoint播客#70:青年,企业和播客
  20. Wix 安装部署教程(十三) -- 多语言安装包

热门文章

  1. jps后发现DataNode没有启动
  2. Koa2-下载-文件流
  3. [Unity][ShaderGraph][FlowCanvas] SetFloat 无效:通过脚本控制 shader 的动态参数时需要使用参数的引用名
  4. [UE4] Pawn 移动时没有碰撞的解决办法:使用 AddActorWorldOffset 并勾选 Sweep
  5. “此网站使用的安全性配置已过时,这可能会导致您的信息(例如密码、消息或信用卡卡号)”
  6. a 标签中 rel=“noopener noreferrer“属性的含义和功能
  7. 如何查看vantUI官方组件的.vue文件(抛转篇)
  8. vue路由+ elementUI表格组件:loop文章列表页enter内容页(vue路由传参userid)- 代码篇
  9. PC电脑 屏幕竖直截长屏、本地视频转码、本地视频转gif动画、gif压缩等
  10. 自旋锁 Linux内核,Linux内核中的自旋锁