• 聊聊、Nginx GDB与MAIN参数


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

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

  • 相关阅读:
    Solaris下批量kill掉oracle的session
    我写blog的方式变迁
    filezilla ftp client在win7 下获取ftp目录信息出错解决方法
    GNU System Monitor编译问题
    在vmware的Solaris虚拟机中安装vmtool
    关于golden gate director client的一点点使用总结
    测试 乱弹
    ORM的世界 (再补充)
    Yahoo Konfabulator
    轻量容器和注射依赖 的自实现
  • 原文地址:https://www.cnblogs.com/xums/p/6741096.html
Copyright © 2020-2023  润新知