使用CLion+WSL debug nginx源码
1. 环境准备
- 支持WSL的Windows系统,只要支持WSL,windows10和windows11均可!
- 基于WSL Ubuntu20.4,具体怎么在WSL中安装Ubuntu请自行查找资料!
需要在ubuntu中安装以下软件:sudo apt install gcc g++ cmake make
- 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源码相关推荐
- Nginx源码分析:启动流程
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...
- LNMP架构环境搭建之PHP、Nginx源码编译安装及其简单配置应用
LNMP架构中的Mysql见上一篇博文"LNMP架构环境搭建之mysql源码编译安装" 一.PHP简介 PHP(外文名:PHP: Hypertext Preprocessor,中文 ...
- NGINX源码之:ngx_hash
老规矩,先来看下ngx_hash大概的结构图: 注意: name的剩余字节是不在ngx_hash_elt_t的结构体占用内存中的,这里是个奇技淫巧,一定程度上保证key的不定长和内存浪费 在进入源码分 ...
- Nginx源码完全注释(4)ngx_queue.h / ngx_queue.c
Nginx源码完全注释(4)ngx_queue.h / ngx_queue.c 作者:柳大·Poechant(钟超) 邮箱:zhongchao.ustc#gmail.com(# -> @) 博客 ...
- 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 ...
- NGINX源码之:ngx_arrayngx_listngx_string
1.array 老规矩,先看下array的结构 /* 数组Array结构体 */ typedef struct {void *elts; /* 指向数组第一个元素*/ngx_uint_t nelts; ...
- NGINX源码之:目录导航
Nginx版本1.20 debug用的源码码云地址点这里 本人debug用的cento7的图形界面系统,cento7中安装clion2020.1 NGINX源码依赖安装yum -y install g ...
- CMake编译Nginx源码
背景 最近打算学习nginx源码,但使用clion IDE查看不支持跳转.因为源码是使用autotool维护的,而clion需要CMake管理项目.着手编译nginx源码. 环境 os : ubunt ...
- nginx系列第二篇:nginx源码调试
第一篇将nginx源码从下载到运行进行了说明,这一节继续讲解如何调试nginx源代码.本人使用vscode进行调试,选择vscode是因为其比较轻巧,python/C++/C/js等开发都可以,适用性 ...
最新文章
- 百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市
- Character-level Convolutional Networks for Text Classification
- 删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题
- NSString与NSData互转
- php upw5.5,UPW
- springsecurity中session失效后怎样处理_结合Spring Security进行web应用会话安全管理
- spring-boot-admin 2.0小试牛刀
- TLS握手、中断恢复与证书中心的原因
- 携程否认竞价排名;戴尔为“吃鸡外挂”致歉;腾讯将发区块链游戏 | CSDN极客头条
- oracle 插入n字母,Nhibernate在oracle批量插入失败,求解?
- c语言开发kafka环境,c++(11)使用librdkafka库实现kafka的消费实例
- Spring Boot 菜鸟教程 1 HelloWorld
- 计算机组成原理中EMAR是什么,计算机组成原理(罗克露)第3章cpu.ppt
- 最新版Mysql安装步骤
- 【硬件工程师炼成之路】器件篇 铝电解电容 电感 磁珠
- 【运营】新产品推广流程整理
- 使用Pyton将MAC地址转换成指定格式
- 抓包工具 Charles使用教程---抓取接口数据
- TMS320F28379D——时钟系统
- 阿龙的学习笔记---Effective C++---第一章:习惯C++
热门文章
- AutoCAD数据导入SuperMap后的投影定义与投影转换
- MYSQL中导入Excel文件
- 【Matlab】Matlab如何将脚本m文件打包成App
- 【Qt入门第1篇】 基础(一)Qt开发环境的搭建和hello world
- 以下描述java字符串错误的是_浙江理工大学java题库
- 重磅!ARPA上榜2020年隐私计算产业30强
- 分享一套我现在在使用Autohotkey的脚本
- C语言总结(第5章循环结构程序设计)
- 基于javaweb的课程信息管理系统(java+springboot+freemarker+mysql)
- Java编程练习题之冒泡排序