这篇文章我们继续学习 main 方法,我们先来看看 ngx_debug_init() 这个方法。

从方法名我们也知道,debug初始化。我们先看看方法位置在哪。我们来断点在这个方法上面。

Function “ngx_debug_init” not defined。 我们去源码里面查找,grep “ngx_debug_init” -r *。

通过搜索结果大家应该知道,这个函数主要用于跨操作系统的东西。在 Linux 系统中应该是 src/os/unix/ngx_linux_config.h:#define ngx_debug_init()。 仅仅是一个宏定义,内容为空。大家可以去src/os/unix/ngx_linux_config.h 中看看。也就是说对于 Linux 平台,这个函数没有意义。所以 gdb 中运行 Nginx,直接就跳到了ngx_strerror_init() 方法。 那我们就来看看 ngx_strerror_init() 方法的作用。我们还是从启动 Nginx 开始,gdb nginx,b main,r,然后输入 s 命令。

ok,ngx_strerror_init () at src/os/unix/ngx_errno.c:58。去58行看看。

这就是 ngx_strerror_init 方法体了。前面的变量我们就不看了,直接看 len = NGX_SYS_NERR * sizeof(ngx_str_t);

ngx_str_t 长度为 8,我的是 32 位系统。如果是 64 位系统长度就是 16 了。那么 NGX_SYS_NERR 是多少呢?

objs/ngx_auto_config.h:#define NGX_SYS_NERR  132。 也就是 NGX_SYS_NERR=132。是一个宏定义,132。 那么 len = NGX_SYS_NERR * sizeof(ngx_str_t); len 就是 132*8=1056 了。 接着看!这行计算,根本没在 CPU 上计算,而是在编译的时候已经算完了。ngx_sys_errlist = malloc(len);是申请一块堆上的内存。类似于 Java 中的 new。在 gdb 中输入命令 n ,next 意思,我们看看下一行代码。

我们看看 len 的长度是多少?输入 p len。

没错,1056。再看看 ngx_sys_errlist。static ngx_str_t  *ngx_sys_errlist;一个结构指针。输入 p ngx_sys_errlist。

(ngx_str_t *) 0x0 说明什么呢?也就是在没有运行 ngx_sys_errlist = malloc(len);之前,堆栈上面它的地址字节都为 0。解释下 0x0地址。操作系统和 CPU,一起做了一个设定,地址是 0x0 的那个地址,在应用程序的进程地址空间,是不可访问的。主要是为了程序员写指针初始化的时候用的。如果你要是现在用代码操作这个地址,0x0,就会引发常规的非法地址访问。操作系统就把你的进程直接杀掉了。 我们继续 next。

再打印 ngx_sys_errlist 看看。

已经分配了地址。接下来 if (ngx_sys_errlist == NULL) { goto failed; } 如分配失败,为 NULL,则去到 failed。大家自己看。 再接下来就是一个循环了。

for (err = 0; err < NGX_SYS_NERR; err++) {

msg = strerror(err);

len = ngx_strlen(msg);

    p = malloc(len);
if (p == NULL) {
goto failed;
}
ngx_memcpy(p, msg, len);
ngx_sys_errlist[err].len = len;
ngx_sys_errlist[err].data = p;
}

先看看 msg = strerror(err); 这个方法。一看就不是 Nginx 自己的方法,应该是底层 C 的方法。在 Linux 控制台输入 man strerror 打印看看。

于是我们就知道 strerror() 函数返回一个指针,指向一个“字符串”,就是一个地址,里面有一些字符,以 0x0 结尾。继续 next。

当 err=0 的时候,错误信息为 Success。 继续 next

当 err=1 的时候,msg 为 Operation not permitted。大家可以自己试试,看看不同的 err 都是什么错误信息。 大家有没有发现,msg 信息最前面为什么会有奇怪的地址呢? $15 = 0x235e94 “Success”。其实这是个动态链接库,有兴趣的同学可以查一下动态链接库的地址空间。 接下来继续 ngx_memcpy(p, msg, len);然后做一个字符串复制。 ngx_sys_errlist[err].len = len; ngx_sys_errlist[err].data = p; 这个大家一看就知道,向 ngx_sys_errlist 中赋值。 到这里,我们可以看出来了,ngx_sys_errlist 就是一个结构数组。一共是 132 个。用来存放所有的系统基本错误信息。 好,下节课我们讲 ngx_get_options()。

聊聊、Nginx 初始化错误信息的更多相关文章

  1. http 错误代码解释 && nginx 自定义错误【转】

    如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求. 此状态代 ...

  2. nginx error_log 错误日志配置说明

    nginx的error_log类型如下(从左到右:debug最详细 crit最少): [ debug | info | notice | warn | error | crit ] 例如:error_ ...

  3. Nginx 502错误触发条件与解决办法汇总(转载)

    一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现.有些站长是在刚刚转移到Nginx之后就出现了这个问题,所以经常会怀疑这是不是Nginx的问题,但 ...

  4. odbc错误信息一览表

    ODBC 错误信息 根据 X/Open 和 SQL Access Group SQL CAE 规范 (1992) 所进行的定义,SQLERROR 返回 SQLSTATE 值.SQLSTATE 值是包含 ...

  5. php 错误信息配置

    display_errors = on/off错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项.错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利.推荐关闭此选项. ...

  6. Delphi 的各种错误信息(中英文)

    ******************************* * 编 译 错 误 信 息 * ******************************* ';' not allowed befo ...

  7. [转]Jquery中AJAX错误信息调试参考

    下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求 ...

  8. nginx 502错误

    一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现.以下是小编搜集整理的一些Nginx 502错误的排查方法,供参考: Nginx 502错误的原因 ...

  9. [Python Web]配置 nginx 遇到错误排查(初级)

    配置 nginx 遇到错误排查(初级) 系统版本:ubuntu 14.04,nginx 版本:nginx/1.4.6 (Ubuntu) 本文不是一步步搭建 nginx 的过程,而是我在使用 nginx ...

随机推荐

  1. 工作方法-scrum+番茄工作法

    1.产品和开发团队近期的工作分析和安排,使用scrum. 产品的工作:通过product backlog来列出 开发团队近期的工作安排:通过sprint backlog来列出,由个人认领,并估算(优先 ...

  2. 将服务器上的文件通过HttpWebRequest下载到本地

    外网地址需要先映射. string path=""; path=@"http://222.92.71.116/P2Foundation/Images/logo.gif&q ...

  3. HYSBZ 1010 玩具装箱toy (决策单调DP)

    题意: 有n个玩具,要将它们分为若干组,玩具长度C可能不同.给出n个玩具的摆放顺序,连续的任意多个玩具都可以成为一组.区间[i,j]成为一组的费用是cost=(j-i+Sigma(Ck)-L)2且i& ...

  4. Netweaver和CloudFoundry是如何运行Web应用的?

    Netweaver 在Jerry的微信公众号文章SAP Fiori应用的三种部署方式里提到SAP Fiori应用以BSP应用的方式部署在ABAP Front-End Server上.那么这些BSP应用 ...

  5. UVA 11627 Slalom(二分)

    二分,判断的时候,一个点一个点的考虑肯定是不行啦,考虑的单位是一个区间, 每次左端点尽量向左边移动,右端点尽量向右,得到下次可以达到的范围,检查一下和下一个区间有没有交集. #include<b ...

  6. Codeforces Round #319 (Div. 2) C Vasya and Petya's Game (数论)

    因为所有整数都能被唯一分解,p1^a1*p2^a2*...*pi^ai,而一次询问的数可以分解为p1^a1k*p2^a2k*...*pi^aik,这次询问会把所有a1>=a1k &&am ...

  7. cdoj 414 八数码 (双向bfs+康拓展开,A*)

    一道关乎人生完整的问题. DBFS的优越:避免了结点膨胀太多. 假设一个状态结点可以扩展m个子结点,为了简单起见,假设每个结点的扩展都是相互独立的. 分析:起始状态结点数为1,每加深一层,结点数An ...

  8. Connectivity

    6492: Connectivity 时间限制: 1 Sec  内存限制: 128 MB提交: 118  解决: 28[提交][状态][讨论版][命题人:admin] 题目描述 There are N ...

  9. echarts实现仪表盘(自己动起来,没有后端,顺便重温math.random

    let a = parseInt(Math.random() * (2 + 1), 10); let arr = []; arr.push(res[a]); let option = { toolti ...

  10. J.U.C知识点梳理

    java.util.concurrent : 提供了并发编程的解决方案 1.CAS 是java.util.concurrent.atomic包的基础 2.AQS是java.util.concurren ...