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不支持动态断点,需要在启动调试前,或者调试状态下设置断点。

原文地址:https://www.cnblogs.com/atskyline/p/7921521.html