接着上一篇,我们学习nginx的main方法。

用gdb工具调试nginx,首先gdb nginx。如下:

nginx alias js问题 nginx args_nginx


gdb调试工具有很多的命令,上一篇为了找main方法用了 b 命令,也就是breakpoint的意思。输入b main。

nginx alias js问题 nginx args_nginx alias js问题_02


要调试必须得先启动nginx,输入 r 命令,也就是run的意思。

nginx alias js问题 nginx args_源码_03


ok,到这里我们就启动了nginx。到win系统下我们拷贝的源代码中,我们来看看main方法中到底有什么。每个部分又有什么作用。

nginx alias js问题 nginx args_nginx_04

这里是一部分main方法,也就是今天要讲的内容。

首先,我们看看,main方法的两个参数,argc和argv。一个是int类型,一个是char指针数组。关于指针,数据结构大家可以看看C语言相关知识。

上面我们已经运行起来了nginx,我们输入p argc命令 看看argc参数中是什么内容。

nginx alias js问题 nginx args_nginx alias js问题_05

$1 = 1,也就是argc内容为1。

再输入 p argv。

nginx alias js问题 nginx args_nginx alias js问题_06

$2 = (char * const ) 0xbfc971d4,内容为(char const *) 0xbfc971d4。这是一个指针数组地址。并没有看到里面到底是什么数据。仅仅是一个地址而已。

我们知道了参数argc内容为整数 1 。为了证实内容真的为 1 。我们去它的内存空间看看。输入命令p &argc。

nginx alias js问题 nginx args_main方法_07

x/4b的意思是查看地址的前4个字节。我的系统是32位的,有点老了,如果是64位系统则x/8b。int类型数据在32位系统占4个字节。大家可以看到打印出来的前4个字节为:

0xbfc97150: 0x01 0x00 0x00 0x00。这个地址一看就知道是小端地址,排完序为0x00000001。也就是整数 1。

接着我们看看参数argv内存中数据是什么。

nginx alias js问题 nginx args_java_08


这是什么东东。我们来拼接一下,/usr/local/nginx/sbin/nginx。

原来argv指针数组里面存的是/usr/local/nginx/sbin/nginx。也就是我们nginx启动目录。我们接着输入p argv[0]命令,看看第一个参数是不是/usr/local/nginx/sbin/nginx。

nginx alias js问题 nginx args_java_09

没错,还真是的。好,到这里我们知道了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 alias js问题 nginx args_nginx alias js问题_10

时间原因,就到这里,没有讲完计划的内容,下篇继续。