`
haoningabc
  • 浏览: 1478048 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx执行流程

阅读更多
目标:打印nginx执行之后的流程方法

my_debug.c
cat my_debug.c
#include "my_debug.h"
#define MY_DEBUG_FILE_PATH1 "/usr/local/nginx_sendfile/sbin/trace.txt"
#define MY_DEBUG_FILE_PATH "/data/haoning/mygit/mynginxmodule/nginx_release/debug/my_debug.log"
int _flag=0;
#define open_my_debug_file() \
    (my_debug_fd=fopen(MY_DEBUG_FILE_PATH,"a"))
#define close_my_debug_file() \
    do { \
        if (NULL != my_debug_fd) { \
            fclose(my_debug_fd); \
        } \
    }while(0)

#define my_debug_print(args,fmt...) \
    do{ \
        if (0 == _flag) { \
            break; \
        } \
        if (NULL == my_debug_fd && NULL == open_my_debug_file()) { \
            printf("Err: can not open output file.\n"); \
            break; \
        } \
        fprintf(my_debug_fd,args,##fmt); \
        fflush(my_debug_fd); \
    }while(0)

void enable_my_debug( void )
{
    _flag = 1;
}
void disable_my_debug( void )
{
    _flag = 0;
}
int get_my_debug_flag( void )
{
    return _flag;
}
void set_my_debug_flag( int flag )
{
    _flag = flag;
}
void main_constructor( void )
{
    //do nothing
}
void main_destructor( void )
{
    close_my_debug_file();
}
void __cyg_profile_func_enter( void *this,void *call )
{
    my_debug_print("enter\n%p\n%p\n",call,this);
}
void __cyg_profile_func_exit( void *this,void *call )
{
    my_debug_print("exit\n%p\n%p\n",call,this);
}

my_debug.h
#ifndef MY_DEBUG_LENKY_H
#define MY_DEBUG_LENKY_H
#include <stdio.h>

void enable_my_debug( void ) __attribute__((no_instrument_function));
void disable_my_debug( void ) __attribute__((no_instrument_function));
int get_my_debug_flag( void ) __attribute__((no_instrument_function));
void set_my_debug_flag( int ) __attribute__((no_instrument_function));
void main_constructor( void  ) __attribute__((no_instrument_function,constructor));
void main_destructor( void  ) __attribute__((no_instrument_function,destructor));
void __cyg_profile_func_enter( void *,void *  ) __attribute__((no_instrument_function));
void __cyg_profile_func_exit( void *,void *  ) __attribute__((no_instrument_function));

#ifndef MY_DEBUG_MAIN
extern FILE *my_debug_fd;
#else
FILE *my_debug_fd;
#endif
#endif

cp my_debug.c my_debug.h ../nginx-1.5.6/src/core/

vim ../nginx-1.5.6/src/core/nginx.c
  11 #include   <nginx.h>
  12 #include   "my_debug.h"
.....
204 main(int argc, char *const *argv)
205 {
206     enable_my_debug(); 

configure之后修改objs/Makefile
CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -finstrument-functions
...
18 CORE_DEPS = src/core/nginx.h \
19     src/core/my_debug.h \ 
.....
  84 HTTP_DEPS = src/http/ngx_http.h \
  85     src/core/my_debug.h \
....

 105 objs/nginx: objs/src/core/nginx.o \
 106     objs/src/core/my_debug.o \  
......
 216     $(LINK) -o objs/nginx \
 217     objs/src/core/nginx.o \
 218     objs/src/core/my_debug.o \ 
......
 331 objs/src/core/my_debug.o:   $(CORE_DEPS) src/core/my_debug.c                                                                                                       
 332     $(CC) -c $(CFLAGS) $(CORE_INCS) \
 333         -o objs/src/core/my_debug.o \
 334         src/core/my_debug.c



make &&make install 之后
启动
./nginx
得到
/data/haoning/mygit/mynginxmodule/nginx_release/debug/my_debug.log
编写处理脚本
addr2line.sh
#!/bin/sh
if [ $# != 3 ]; then
    echo 'Usage: addr2line.sh executefile addressfile functionfile'
    exit;
fi;
echo "begin"
cat $2 |while read line
do
    if [ "$line" = 'enter' ]; then
        read line1
        read line2
#       echo $line >> $3
        addr2line -e $1 -f $line1 -s >>$3
        echo "--->" >> $3
        addr2line -e $1 -f $line2 -s | sed 's/^/  /' >> $3
        echo  >> $3
    elif [ "$line" = 'exit' ]; then
        read line1
        read line2
        addr2line -e $1 -f $line2 -s | sed 's/^/  /' >> $3
        echo "<---" >> $3
        addr2line -e $1 -f $line1 -s  >> $3
#       echo $line >> $3
        echo >> $3
    fi;
done
echo "end"


./addr2line.sh /usr/local/nginx_sendfile/sbin/nginx my_debug.log a.log
生成a.log为所要的结果
类似如下
main                                                                                                                                                                    
nginx.c:216
--->
  ngx_strerror_init
  ngx_errno.c:47

  ngx_strerror_init
  ngx_errno.c:47
<---
main
nginx.c:216

??
??:0
--->
  main
  nginx.c:205

  main
  nginx.c:205
<---
??
??:0

main
nginx.c:280
--->
  ngx_time_init
  ngx_times.c:61

ngx_time_init
ngx_times.c:69
--->
  ngx_time_update
  ngx_times.c:75

ngx_time_update
ngx_times.c:116
--->
  ngx_gmtime
  ngx_times.c:284

  ngx_gmtime
  ngx_times.c:284
<---
ngx_time_update
ngx_times.c:116

附件中a.log.jpg 重命名为a.log查看具体内容
分享到:
评论

相关推荐

    补充:Nginx之模块处理流程

    Nginx是一个高性能的Web服务器和...这个流程确保了Nginx能够高效、稳定地处理各种请求,同时提供了强大的功能扩展性。通过组合和配置不同的模块,Nginx可以满足从简单的静态文件服务器到复杂的应用服务器的各种需求。

    nginx HTTP处理流程.docx

    3. **编译源码**:执行`make`命令,这将根据Makefile编译源代码,生成可执行文件`nginx`。所有源代码位于`src`目录下,其中`src/core`、`src/event`、`src/http`等子目录分别对应核心功能、事件处理、HTTP服务器等...

    nginx安装全流程

    ### Nginx安装全流程 Nginx是一款高性能的HTTP服务器及反向代理服务软件,它在互联网领域扮演着至关重要的角色。本文将详细介绍Nginx的安装全流程,涵盖安装前的准备、安装步骤、配置流程以及如何实现开机自启动。 ...

    Nginx关于Rewrite执行顺序详解.docx

    Nginx是一款高性能的HTTP和反向代理服务器,广泛用于网站的负载均衡和内容分发。...在实际应用中,要特别注意避免重写规则引起的循环和不必要的重定向,以及合理利用各种标志来控制规则的执行流程。

    详解nginx请求头数据读取流程

    在这个过程中,Nginx会检查每个请求头,将其存储到内存中,并执行相应的处理。 1. 缓冲区管理:当缓冲区中没有足够的空间存储新请求头时,`ngx_http_process_request_headers()`会分配更大的缓冲区。如果客户端发送...

    基于linux离线安装nginx的全包,及安装流程命令说明

    lua-resty是Nginx的Lua接口,用于在Nginx内部执行Lua脚本。为了集成lua-resty,首先需要安装OpenResty,它是一个预编译的Nginx发行版,集成了lua-nginx-module和其他相关模块。 1. 获取OpenResty源码包,如`...

    搭建Nginx的操作流程

    ### 搭建Nginx的操作流程详解 #### 一、Nginx简介与特性 Nginx(发音为 "engine X")是一款开源的Web服务器软件,它以高性能、稳定性和低资源消耗著称。Nginx不仅能够提供HTTP服务,还可以作为反向代理、负载均衡...

    nginx arm64版本nginx-linux-arrch64.zip

    提供预编译的ARM64 Nginx版本,用户可以直接解压到服务器上,避免了编译过程中的依赖问题和配置错误,简化了部署流程。 5. **使用和配置Nginx** 解压后,将Nginx二进制文件放置到适当目录(如`/usr/local/nginx/...

    nginx升级过程文档.docx

    以下是一个详细的Nginx升级流程: 1. **停止Nginx服务** 在升级前,首先需要安全地关闭正在运行的Nginx服务,以避免数据丢失或冲突。这可以通过执行`pkill nginx`来实现,该命令会终止所有与nginx相关的进程。 2....

    Windows平台,Nginx配置文件修改自动加载重启

    总之,`nginx-conf-watcher`是一个实用的Windows工具,它能帮助我们自动化Nginx配置文件的更新流程,让Nginx始终保持最新的配置状态,提高了运维的便利性和响应速度。在使用过程中,理解其工作原理并适当定制以适应...

    nginx各版本源码包

    4. **编译前准备**:进入解压后的目录,例如 `cd nginx-1.17.6`,然后根据系统需求执行必要的配置命令,例如 `./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module`,这...

    Centos7的nginx-1.24.0免编译包,直接解压修改配置文件,启动即可

    本资源提供的是 Nginx 的 1.24.0 版本,它是一个预编译好的二进制包,无需进行编译安装,简化了部署流程。 **安装与部署** 1. 首先,将提供的 `nginx.zip` 文件解压缩到你希望 Nginx 运行的目录下,例如 `/usr/...

    阿里云服务器配置nginx+https

    由于这是升级过程,不执行`make install`,而是备份旧的Nginx执行文件: ```bash mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old ``` 将新编译的Nginx复制到相应目录: ```bash cd objs/ cp ...

    nginx-1.21.6安装包

    本安装包为nginx-1.21.6版本,是Nginx的最新稳定版,适用于Linux、Windows等多种操作系统平台。 Nginx的核心功能包括: 1. **静态资源处理**:Nginx擅长处理静态文件,如HTML、CSS、JavaScript、图片等,通过缓存...

    nginx的try_file命令实现404跳转_nginx_tryfile404_

    在处理静态资源请求时,Nginx提供了一个非常实用的指令——`try_files`,它允许我们定义在找不到指定文件时执行的后续操作,比如重定向或者执行特定的URI。本文将深入探讨`try_files`命令在Nginx中的应用,以及如何...

    nginx-script_nginx_shell_

    以下是一个基本的Nginx安装Shell脚本流程: 1. **检查系统信息**:脚本首先会获取Linux发行版和版本信息,例如使用`lsb_release -a`或`cat /etc/os-release`命令。这一步确保脚本可以根据不同的系统环境进行适配。 ...

    nginx-1.9.8.zip

    在了解了Nginx的基本概念和操作流程后,你将能够更好地管理和优化你的Web服务器,提升网站的性能和稳定性。记住,Nginx的灵活性和可扩展性使得它在各种复杂环境中都能发挥出色的作用,是现代Web服务不可或缺的一部分...

    NGINX如何进行伪装-通过LNMP安装

    以上知识点涵盖了通过LNMP安装环境进行Nginx的重新编译和伪装的完整流程,包括源代码修改、编译参数的指定、配置文件的修改以及服务的重启和验证。掌握了这些知识点后,就可以根据需要对Nginx进行定制化的伪装设置,...

    window下nginx配置

    通过本文的介绍,我们可以了解到在Windows环境下部署Nginx的基本流程和配置方法。Nginx不仅可以作为高性能的Web服务器,还可以实现负载均衡、反向代理等多种功能,非常适合用于处理高流量的网站。对于希望降低成本...

    nginx原码版本0.9.5

    请求处理流程 当 Nginx 收到一个请求时,会按照以下步骤处理: 1. **接受连接**:工作进程通过事件处理器接受新连接。 2. **预处理**:解析请求头,检查请求合法性。 3. **路由匹配**:根据请求的 URI 和配置文件...

Global site tag (gtag.js) - Google Analytics