使用eclipse-cpp 调试c程序之: Nginx debug
对C程序一直有一定的向往,尽管之前是以C为根基的,但是对于大型实战型项目,并未接触过。
最近想了解Nginx到底是如何工作的,于是决定读读其源码。但由于其项目之大,依赖之多,我之前未处理过,于是翻遍各种资料。只希望能够了解更多一点。大概明白了 nginx的核心,实际就是 epoll 之类的非阻塞io的实现,然后模块化的方式,大量管理各种外部插件。 其重要架构模式为:一个master进程负责管控所有 worker进程,而所有worker进程由负责处理所有的客户端的连接操作,且使用一定的锁优化机制,避免多进程的socket惊群效应。
但对于其实际运行的效果,还是模模糊糊,于是心想,要是能debug的话就好了。
于是乎开启了我nginx debug构建之路了。最终找下来,主要使用这篇文章进行操作: https://blog.csdn.net/imlsz/article/details/50441830
要说难也不难,只是也会花费不少时间了。而自己的实践步骤也略微多些,于是记录。
1. 下载nginx源码
这是肯定的,要想debug它,必定需要下载源码。这个源码你可以使用hg工具,在官网指定的地方下载,也可以直接在github上搜索下载。由于hg工具太难搞,于是果断使用github下载源码了。但github也照样太慢,使用git clone 基本下载不下来,于是 使用了下载zip包的形式搞定源码问题(使用zip包的最大不好的就是,你如果在本地做了一些修改,并不能很好的发现,因为没有版本的所以概念在了)
github地址:https://github.com/nginx/nginx.git
hg 地址: http://hg.nginx.org/nginx
这样,你就可以得到nginx源码了。
2. 下载cygwin操作系统环境
这些开源软件,大多要基于linux做的,于是乎,想在windows下搞点事情,就会显得麻烦些。下载 cygwin 安装, 必要组件: zlib、gcc、gdb、openssl、pcre 。
安装好之后,可以自行验证下,尤其是 gdb, 可以直接运行看看。
在cygwin下,你可以认为自己就是一个linux环境了,很多方便的工具都可以用了。比如 awk, sed, grep, ps, cat ...
3. 下载eclipse-cpp ide 环境
工欲善其事,必先利其器。一个好的ide可以让我们很快速的得到想要的东西,eclipse就是这种(visual c 那套太重,且要破解)。
下载地址: https://www.eclipse.org/downloads/packages/release/luna/r/eclipse-ide-cc-developers
4. 在cygwin下载准备编译环境
源码下载下来之后,不要急着导入ide环境中,我们需要在cygwin中操作点啥先。即先在 ide 进行configure. 比如我用以下命令进行配置:
auto/configure --with-debug --prefix=E:/practice/github/c/nginx-master --with-http_ssl_module
因为我的目的不在于编译某个模块,所以加载项非常少,主要是添加了 --with-debug 模块,方便后续debug。
运行完以上命令后(大约10分钟),就可以导入 eclipse 了,使用 empty makefile 的形式导入,以cygwin的方式导入。
5. 配置eclipse编译项
按照上文中的步骤,一步步来,主要就是: 勾上 cygwin PE parse和PE window parse , 添加路径映射到source中, 修改配置文件为 24 的worker_connections, run 就行。
此时,如果想进行debug, 可能会报错, 0x00000135 之类什么,网上查了之后说是缺少什么包,我也不懂了。最后,如果想debug, 可以通过 container application 的方式,连接到其他进程进行调试即可。因为这个gdb 调试也是可行的。
=======>>>>>
然后就可以debug跟踪了。
其中,能看到多少个nginx进程,主要取决于你在 nginx.conf 中的配置,worker_process: x , 而你在进行debug时,则会区分master和worker的代码,可能你需要尝试下选择进程,或者直接关闭 子进程模式即可只看到一个 nginx进程了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?