首页 > 代码库 > nginx源码学习(三)
nginx源码学习(三)
接着上一篇,我们学习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源码学习(三)