zoukankan      html  css  js  c++  java
  • windows下编译调试nginx


    typora-copy-images-to: image

    windows下编译调试nginx

    linux使用gdb跟踪代码效率不高,在通过跟踪代码进行源码分析,与定位复杂逻辑问题时,如果有一个简单易用调试环境能极大提高效率。由于不想折腾linux的桌面系统,也担心x-window链接性能问题,顾考虑在windows下编译nginx并进行调试。

    我使用的编译器是MinGW的gcc套件,界面使用VS code。

    2篇核心的参考链接如下:

    《Building nginx on the Win32 platform with Visual C》

    《C/C++ for VS Code》

    安装MinGW套件

    下载安装地址:http://www.mingw.org/

    下载安装后是一个MingGW Installation Manager,可以选择mingw32-base和msys-base两个包。

    mingw32-base包括基本的gcc套件,msys-base有一些基本的linux命令工具,在后续执行configure时需要使用。

    下载nginx源码与依赖库

    下载源码必须通过http://hg.nginx.org/nginx 进行下载,不可使用发布的源码包,否则无法支持windows下编译。可以选择在网页下载或通过hg下载。

    可以按 《Building nginx on the Win32 platform with Visual C》链接所示,现在依赖的第三方库。

    如果仅作代码跟踪调试使用,可以先利用调整编译参数,去除对第三方库的依赖。下文提供的编译参数即不需要使用第三方库

    编译nginx

    解压源码后,启动MinGE的msys.bat,进入到源码目录,执行以下命令生成Makefile。msys执行configure的速度较慢,需要耐心等待。

    ./auto/configure 
    --with-cc=gcc 
    --with-cc-opt=-O0 
    --with-debug 
    --prefix= 
    --conf-path=conf/nginx.conf 
    --pid-path=logs/nginx.pid 
    --http-log-path=logs/access.log 
    --error-log-path=logs/error.log 
    --sbin-path=nginx.exe 
    --http-client-body-temp-path=temp/client_body_temp 
    --http-proxy-temp-path=temp/proxy_temp 
    --http-fastcgi-temp-path=temp/fastcgi_temp  
    --http-scgi-temp-path=temp/scgi_temp 
    --http-uwsgi-temp-path=temp/uwsgi_temp 
    --without-http_rewrite_module 
    --without-http_gzip_module 
    --with-select_module
    

    我的脚本与官方链接中的几个区别:

    • 使用gcc作为编译器,而不是vs的cl
    • 增加-O0参数,方便代码跟踪调试
    • 没添加http_ssl_module、http_rewrite_module、http_gzip_module省去第三方库依赖

    成功生成Makefile后通过执行make命令进行编译,编译的结果在objs ginx.exe

    调试nginx

    参考《C/C++ for VS Code》进行配置,配置launch.json文件。

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(gdb) Launch",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceFolder}/objs/nginx.exe",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${workspaceFolder}/objs",
                "environment": [],
                "externalConsole": false,
                "MIMode": "gdb",
                "miDebuggerPath": "D:/MinGW/bin/gdb.exe",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    }
                ]
            }
        ]
    }
    

    修改了模板中的program、cwd、miDebuggerPath三个参数。

    为了调试nginx方便,可以配置nginx.conf中的以下几个参数。

    daemon off;
    master_process off;
    worker_processes  1;
    

    注意msys不支持动态断点,需要在启动调试前,或者调试状态下设置断点。

  • 相关阅读:
    C++类成员变量多用指针不用对象
    C++列表初始化是初始化本类自身含有的成员变量,不能直接初始化继承过来的成员变量
    std::unorder_set你插入元素的顺序不一定就是元素在里面的元素
    yolo3使用darknet卷积神经网络训练pascal voc
    windows下执行tensorflow/models的代码显示No module named 'object_detection'
    extern const 不能一起用
    常见PID里面的像素大小
    ajax 异步请求webservice(XML格式)
    剖析下聊天室
    session更换存储,实现在多台服务器共享
  • 原文地址:https://www.cnblogs.com/atskyline/p/7921521.html
Copyright © 2011-2022 走看看