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

windows下编译调试nginx的更多相关文章

  1. windows下编译基于nginx插件的rtmp流媒体服务nginx-rtmp

    1 概述 rtmp流媒体服务器,开源方案有多种,包括srs,red5,crtmpserver,fms,nginx插件等.本文描述了基于nginx插件的方式来实现rtmp流媒体服务器nginx-rtmp ...

  2. Windows下编译SDL

    Windows下编译SDL的理由我就不多说了,无论用VS来编译或调试SDL库都是很方便的.而且SDL源代码中也包含了VC工程,你所要做的只是解压VC工程,进行适当的配置,然后编译.调试. 编译SDL大 ...

  3. [转] Windows下编译OpenSSL

    简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...

  4. Windows下编译objective-C

    Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode   目录 ...

  5. 在Windows下编译FFmpeg详细说明

    MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...

  6. 如何在WINDOWS下编译BOOST C++库 .

    如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25   写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0.   1)下载boost ...

  7. 在Windows下编译OpenSSL(VS2005和VC6)

    需要说明的是请一定安装openssl-0.9.8a .  openssl-1.0.0我没有编译成功. 如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)1.安装Activ ...

  8. windows下编译java源文件的编码错误

    import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ...

  9. Windows下编译安装 FFmpeg

    在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在wind ...

随机推荐

  1. Hello SpringMVC

    1. MVC框架能做哪些事情? 讲url映射到java类或者方法 封装用户提交的数据 处理请求-调用相关业务处理-封装相应数据 将相应数据进行渲染 jsp/html/freemaker等 ... 2. ...

  2. 王垠 :写给支持和反对《完全用Linux工作》的人们 ( 2004/8/26)

    在一阵阵唾骂和欢呼声中,<完全用linux工作>被转载到了天涯海角.很多人支持我,也有很多人唾骂我.我不知道它是怎样流传到那么多地方,其实 我不知道它都被转到哪里去了…… 我知道现在这篇文 ...

  3. 图说OSI七层网络模型

    开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际 ...

  4. ETCD 单机安装

    由于测试的需要,有时需要搭建一个单机版的etcd 环境,为了方便以后搭建查看,现在对单机部署进行记录. 一.部署单机etcd 下载 指定版本的etcd下载地址 ftp://ftp.pbone.net/ ...

  5. 碰撞检測之OBB-OBB的SweepTest

    提要 当物体在运动的时候.普通的每帧进行碰撞检測已经无法满足要求,比方子弹的运动 两帧的位置已经直接将中间的板子穿过了,所以 t 时刻和 t +1 时刻的检測都是失效的.这时候须要用到的就是sweep ...

  6. OC - 读歌词

    类的头文件: #import <Foundation/Foundation.h> //FILE_PATH是文件名称. #define FILE_PATH @"/Users/qia ...

  7. TraceTool 跟踪工具的瑞士军刀(C++版使用)

    TraceTool查看器能够显示多种类型的来源(从提供的框架.日志文件.事件日志.或者OutputDebugString方法).一个简单而强大的client框架发送简单的跟踪,分组跟踪.类和对象浏览器 ...

  8. C语言知识结构之二

    C语言的知识结构整理成思维导图,例如以下图所看到的: 这张图的总体思路是: 用C敲代码.该学会什么? 要用C写的更好,改学会什么? 事实上.仅仅要是分层的知识结构,大致的思路是: 首先,研究本层的知识 ...

  9. 如何卸载centos中自带的Java

    首先通过 Java -version 来查看是否已经安装了java 然后通过rpm -qa | grep java 来获得java的版本信息 然后再 用  rpm -e --nodeps  [这里依次 ...

  10. 三张图教你生成一个Android jar 库。

    我看到非常多教人使用第三方开源组件的Android教程.都是在教基于源代码project的库导入,个人觉得非常不妥,觉得最恰当的方式是把源代码project生成一个jar再导入到目标project上使 ...