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