接着上一篇,我们学习nginx的main方法。
用gdb工具调试nginx,首先gdb nginx。如下:
gdb调试工具有很多的命令,上一篇为了找main方法用了 b 命令,也就是breakpoint的意思。输入b main。
要调试必须得先启动nginx,输入 r 命令,也就是run的意思。
ok,到这里我们就启动了nginx。到win系统下我们拷贝的源代码中,我们来看看main方法中到底有什么。每个部分又有什么作用。
这里是一部分main方法,也就是今天要讲的内容。
首先,我们看看,main方法的两个参数,argc和argv。一个是int类型,一个是char指针数组。关于指针,数据结构大家可以看看C语言相关知识。
上面我们已经运行起来了nginx,我们输入p argc命令 看看argc参数中是什么内容。
$1 = 1,也就是argc内容为1。
再输入 p argv。
$2 = (char * const ) 0xbfc971d4,内容为(char const *) 0xbfc971d4。这是一个指针数组地址。并没有看到里面到底是什么数据。仅仅是一个地址而已。
我们知道了参数argc内容为整数 1 。为了证实内容真的为 1 。我们去它的内存空间看看。输入命令p &argc。
x/4b的意思是查看地址的前4个字节。我的系统是32位的,有点老了,如果是64位系统则x/8b。int类型数据在32位系统占4个字节。大家可以看到打印出来的前4个字节为:
0xbfc97150: 0x01 0x00 0x00 0x00。这个地址一看就知道是小端地址,排完序为0x00000001。也就是整数 1。
接着我们看看参数argv内存中数据是什么。
这是什么东东。我们来拼接一下,/usr/local/nginx/sbin/nginx。
原来argv指针数组里面存的是/usr/local/nginx/sbin/nginx。也就是我们nginx启动目录。我们接着输入p argv[0]命令,看看第一个参数是不是/usr/local/nginx/sbin/nginx。
没错,还真是的。好,到这里我们知道了main方法两个参数的内容,argc = 1,argv[0] = “/usr/local/nginx/sbin/nginx”。
这两个参数是在编译的时候就已经存在,而且是放在堆栈上面。argc = 1表示有一个参数,这个参数就是argv[0]的值。
至于为什么传这个参数,后面会用到。
我们接着讲mian方法,下面是:
ngx_buf_t *b;
ngx_log_t *log;
ngx_uint_t i;
ngx_cycle_t *cycle, init_cycle;
ngx_conf_dump_t *cd;
ngx_core_conf_t *ccf;
这些都是nginx自己的数据结构,输入ptype命令可以看到结构信息。不过一般查询这些数据结构去源码里面搜索,这样利于以后查找问题。
时间原因,就到这里,没有讲完计划的内容,下篇继续。
nginx源码学习(三)
时间: 2024-10-14 00:00:36
nginx源码学习(三)的相关文章
nginx源码学习资源
http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html 2012-06-13 21:32 by 轩脉刃, 26499 阅读, 5 评论, 收藏, 编辑 nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码,
nginx源码学习资源(不断更新)
nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码,可以从下面的链接中下载一份: https://github.com/jianfengye/nginx-1.0.14_comment 这份注释版源码会不断进行更新的 好了,第一个问题, nginx的main函数在哪里呢?
nginx源码学习资源(不断更新)转
原文地址:http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码,可以从下面的链接中下载一份: https://github.com/jianfengy
nginx源码学习(二)
上一篇文章主要介绍了nginx在win和Linux平台上的安装.本章节主要介绍nginx源码学习方法和源码结构,以及nginx启动时main方法的位置,参数信息.后面的章节主要是linux平台,你要问为何是linux,而不是win.我只能说nginx是基于linux平台开发出来的,我也习惯了linux平台开发. 上一篇文章我讲了安装,现在打开MobaXterm,连接上nginx服务器.输入whereis nginx命令查看安装目录: 是的我的安装目录在 /usr/local/nginx
nginx源码学习 资料
首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码,可以从下面的链接中下载一份: https://github.com/jianfengye/nginx-1.0.14_comment 这份注释版源码会不断进行更新的 好了,第一个问题, nginx的main函数在哪里呢? src/core/nginx.c 第二个问题,nginx启动的时候都做了哪些事情
nginx源码学习(四)
这篇文章我们继续学习main方法,我们先来看看 ngx_debug_init() 这个方法.从方法名我们也知道,debug初始化.我们先看看方法位置在哪.我们来断点在这个方法上面. Function "ngx_debug_init" not defined. 我们去源码里面查找,grep "ngx_debug_init" -r *. 通过搜索结果大家应该知道,这个函数主要用于跨操作系统的东西.在Linux系统中应该是src/os/unix/ngx_linux_con
[spring源码学习]三、IOC源码——自定义配置文件读取
一.环境准备 在文件读取的时候,第9步我们发现spring会根据标签的namespace来选择读取方式,联想spring里提供的各种标签,比如<aop:xxx>等应该会有不同的读取和解析方式,这一章我们来找一个其他文件,了解下spring自定义标签和配置的读取流程. 手边正好有一套dubbo的源码,因此为了区别与spring的原生读取,就使用它来进行分析. 首先spring的配置文件中我们需要加上标签的namespace <?xml version="1.0" enc
Bottle 框架源码学习 三
def run(app=None, server='wsgiref', host='127.0.0.1', port=8080, interval=1, reloader=False, quiet=False, plugins=None, debug=None, **kargs): 今天要学习一下bottle里是怎样打印debug信息的 run函数的倒数第二个参数是debug,默认为None try: if debug is not None: _debu
nginx源码学习----内存池
最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.各种内存方面的问题悄然滋生.而且作为平台,后期的插件扩展在所难免.长时间运行的采集平台的特性更是提出了对稳定性的高要求.不是c#.java,没有虚拟机为你管理内存,一切都要靠自己.于是想看看nginx.python.lua这些C的经典之作在内存管理这块“要地”又是如何处理的. 先来看看nginx吧,因为网上都说nginx