1. 环境准备

  1. 支持WSL的Windows系统,只要支持WSL,windows10和windows11均可!
  2. 基于WSL Ubuntu20.4,具体怎么在WSL中安装Ubuntu请自行查找资料!
    需要在ubuntu中安装以下软件:

    sudo apt install gcc g++ cmake make
    
  3. CLion 2022.1,jetbrains出品的专注于C/C++程序开发的IDE,在IDE调试nginx代码更方便。

2. CLion配置WSL toolchain

Settings->Build,Execution,Deployment->Toolchains->点击"+"->选择WSL:

只要是安装了WSL的windows系统且安装了Linux子系统,CLion会自动发现,按需选择对应的Linux子系统即可!
通过上下按钮将WSL调整为默认,点击OK!

3. 下载nginx源码并使用CLion打开

源码地址:http://hg.nginx.org/nginx/rev/release-1.23.0,这里选择1.23.0的版本。

不要使用github下载源码(https://github.com/nginx/nginx.git),因为源码文件中换行符的原因在WSL Ubuntu中执行构建脚本不成功!

下载完成后解压,重命名目录为nginx:

4. 使项目支持cmake

nginx是使用make进行构建的,但是在CLion直接使用make进行构建和debug配置非常繁琐,也不容易成功,所以选择cmake进行构建,为了让CLion支持构建和debug,需要将项目转为cmake项目,步骤如下:
下面是生成CMakeLists.txt文件的脚本

#!/usr/bin/env bash
NGX_CMAKE_FILE=CMakeLists.txt
NGX_CMAKE_TMP=$NGX_OBJS/tmp#output includes
cmake_ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS \sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \-e "s/\//$ngx_regex_dirsep/g"`
cat << END                                  > $NGX_CMAKE_TMP
cmake_minimum_required(VERSION 3.6)
include_directories(.$cmake_ngx_incs)
END#output src
cmake_ngx_src="$CORE_SRCS $HTTP_SRCS $MAIL_SRCS $NGX_MISC_SRCS $NGX_ADDON_SRCS $NGX_SHARED_SRCS"cmake_ngx_src=`echo $cmake_ngx_src | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"\-e "s/\//$ngx_regex_dirsep/g"`cat << END                                    >> $NGX_CMAKE_TMP
set(SOURCE_FILES$NGX_OBJS/ngx_modules.c$cmake_ngx_src)
END#output target
cat << END                                   >> $NGX_CMAKE_TMP
add_executable(nginx \${SOURCE_FILES})
END#output lib
echo ${CORE_LIBS}
CMAKE_CORE_LIBS=`echo ${CORE_LIBS} | sed -e "s/-l//g"`cat << END                                   >> $NGX_CMAKE_TMP
target_link_libraries(nginx $CMAKE_CORE_LIBS)
ENDif [ -f $NGX_CMAKE_TMP ]
then(cat $NGX_CMAKE_TMP | sed -e "s/\\\//g") > $NGX_CMAKE_FILErm $NGX_CMAKE_TMP
fi

在nginx源码的auto目录创建cmake文件,并将上面代码复制到此文件。

修改auto目录configure文件,在“. auto/make”所在行上边增加“. auto/cmake”:

在WSL Ubuntu中执行:
首先进入源码目录。

$ ./auto/configure --prefix="./"

执行成功后,会在源码根目录生成objs目录和CMakeLists.txt文件。

然后打开CMakeLists.txt文件,CLion自动识别该文件:

点击“Load CMake project”,会自动生成:cmake-build-debug,
此目录存放debug时用到的二进制文件:

此时,CLion运行配置自动出现nginx|Debug的配置:
下一步我们就可以点击debug按钮进行构建和debug了。

5. 使用CLion进行debug

点击debug按钮进行构建:

这个过程会持续一段时间!
在构建成功后,启动时报错:

这是因为我们没有nginx日志输出的目录和配置文件,需要手动创建logs目录和conf配置文件:
在cmake-build-debug目录中创建logs目录并将源码中conf目录拷贝到该目录,最后将docs/html目录拷贝到该目录以便我们能够看到nginx的欢迎页面。还要修改conf/nginx.conf文件,关闭守护进程模式和修改监听的端口号为8080,因为监听80端口在WSL Ubuntu中会有权限问题未被拒绝:
nginx.conf:

worker_processes  1;
daemon off;
# .......省略其他
http {include       mime.types;default_type  application/octet-stream;server {listen       8080;server_name  localhost;.....省略其他...
....


在源码上点击创建端点,再次点击debug:

即可进入debug!

使用CLion+WSL debug nginx源码相关推荐

  1. Nginx源码分析:启动流程

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...

  2. LNMP架构环境搭建之PHP、Nginx源码编译安装及其简单配置应用

    LNMP架构中的Mysql见上一篇博文"LNMP架构环境搭建之mysql源码编译安装" 一.PHP简介 PHP(外文名:PHP: Hypertext Preprocessor,中文 ...

  3. NGINX源码之:ngx_hash

    老规矩,先来看下ngx_hash大概的结构图: 注意: name的剩余字节是不在ngx_hash_elt_t的结构体占用内存中的,这里是个奇技淫巧,一定程度上保证key的不定长和内存浪费 在进入源码分 ...

  4. Nginx源码完全注释(4)ngx_queue.h / ngx_queue.c

    Nginx源码完全注释(4)ngx_queue.h / ngx_queue.c 作者:柳大·Poechant(钟超) 邮箱:zhongchao.ustc#gmail.com(# -> @) 博客 ...

  5. Nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c

    Nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c 作者:柳大·Poechant 时间:2012年7月1日 博客:Blog.CSDN.net/Poechant 首先看 ng ...

  6. NGINX源码之:ngx_arrayngx_listngx_string

    1.array 老规矩,先看下array的结构 /* 数组Array结构体 */ typedef struct {void *elts; /* 指向数组第一个元素*/ngx_uint_t nelts; ...

  7. NGINX源码之:目录导航

    Nginx版本1.20 debug用的源码码云地址点这里 本人debug用的cento7的图形界面系统,cento7中安装clion2020.1 NGINX源码依赖安装yum -y install g ...

  8. CMake编译Nginx源码

    背景 最近打算学习nginx源码,但使用clion IDE查看不支持跳转.因为源码是使用autotool维护的,而clion需要CMake管理项目.着手编译nginx源码. 环境 os : ubunt ...

  9. nginx系列第二篇:nginx源码调试

    第一篇将nginx源码从下载到运行进行了说明,这一节继续讲解如何调试nginx源代码.本人使用vscode进行调试,选择vscode是因为其比较轻巧,python/C++/C/js等开发都可以,适用性 ...

最新文章

  1. 百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市
  2. Character-level Convolutional Networks for Text Classification
  3. 删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题
  4. NSString与NSData互转
  5. php upw5.5,UPW
  6. springsecurity中session失效后怎样处理_结合Spring Security进行web应用会话安全管理
  7. spring-boot-admin 2.0小试牛刀
  8. TLS握手、中断恢复与证书中心的原因
  9. 携程否认竞价排名;戴尔为“吃鸡外挂”致歉;腾讯将发区块链游戏 | CSDN极客头条
  10. oracle 插入n字母,Nhibernate在oracle批量插入失败,求解?
  11. c语言开发kafka环境,c++(11)使用librdkafka库实现kafka的消费实例
  12. Spring Boot 菜鸟教程 1 HelloWorld
  13. 计算机组成原理中EMAR是什么,计算机组成原理(罗克露)第3章cpu.ppt
  14. 最新版Mysql安装步骤
  15. 【硬件工程师炼成之路】器件篇 铝电解电容 电感 磁珠
  16. 【运营】新产品推广流程整理
  17. 使用Pyton将MAC地址转换成指定格式
  18. 抓包工具 Charles使用教程---抓取接口数据
  19. TMS320F28379D——时钟系统
  20. 阿龙的学习笔记---Effective C++---第一章:习惯C++

热门文章

  1. AutoCAD数据导入SuperMap后的投影定义与投影转换
  2. MYSQL中导入Excel文件
  3. 【Matlab】Matlab如何将脚本m文件打包成App
  4. 【Qt入门第1篇】 基础(一)Qt开发环境的搭建和hello world
  5. 以下描述java字符串错误的是_浙江理工大学java题库
  6. 重磅!ARPA上榜2020年隐私计算产业30强
  7. 分享一套我现在在使用Autohotkey的脚本
  8. C语言总结(第5章循环结构程序设计)
  9. 基于javaweb的课程信息管理系统(java+springboot+freemarker+mysql)
  10. Java编程练习题之冒泡排序