接着上一篇,我们学习 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 命令可以看到结构信息。不过一般查询这些数据结构去源码里面搜索,这样利于以后查找问题。

时间原因,就到这里,没有讲完计划的内容,下篇继续。谢谢大家观看!

最新文章

  1. 手动安装Oracle的Maven依赖
  2. 【转载】借助GitHub托管你的项目代码
  3. Weblogic AdminServer启动失败,<Security> <BEA-090870> <The realm "myrealm" failed to be loaded
  4. CSS学习心得2
  5. sql server 导出表结构
  6. OpenStack-Mitaka 一键安装测试环境脚本
  7. 【iOS基础】iOS 网络请求
  8. C++程序设计实践指导1.10二维数组元素换位改写要求实现
  9. phpstorm9如何配置interpreter
  10. 上传本地代码及更新代码到GitHub教程
  11. beego 初体验 - 上传文件
  12. 我的代码-normalize
  13. day05 模块学习
  14. 网络爬虫re模块的findall()函数
  15. 《C#从现象到本质》读书笔记(九)第11章C#的数据结构
  16. Windows Server 2008 双网卡 断网问题 总结
  17. web service简述,通俗易懂----转
  18. 查看 postgresql 数据库编码,以及修改数据库编码
  19. 玩转X-CTR100 l STM32F4 l 舵机控制
  20. 用 python 爬虫抓站的一些技巧总结

热门文章

  1. Leet-code144. Binary Tree Preorder Traversal
  2. windows7桌面小工具打不开的解决方案
  3. UVA11019 Matrix Matcher (AC自动机)
  4. 2018.2.14 Java中的哈夫曼编码
  5. 最全面的 python 字符串拼接总结(带注释版)
  6. Java删除开头和末尾字符串
  7. 01_6_SERVLET如何从上一个页面取得参数
  8. 关于cocos2dx for lua资源加载优化方案
  9. tensorflow目标检测API之建立自己的数据集
  10. 网络流(一)——Edmonds Karp算法