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

众所周知,nginx是多进程应用程序,master默认启动是守护进程方式启动。所以调试master进程和work进程的方式不同。下面就进入正题。

1.修改编译参数,保证生成可以调试的程序

gcc编译debug程序的两个常用参数:

-g: 创建调试符号表,符号表包含了程序中使用的变量名称的列表。关闭所有的优化机制,以便程序执行过程中严格按照原来的C代码进行。

-O0: 编译不做任何优化,这是默认的编译选项。

./configure --prefix=/home/baidu123/Downloads/nginx-1.22.1/nginx/bin --with-http_ssl_module --with-stream --with-cc-opt='-O0 -g'
sudo make CFLAGS="-g -oO"
sudo make install

 编译成功见如下目录结构:

 2.调试master进程

(1) 在 conf/nginx.conf 配置文件中添加配置项:daemon off; 如下图所示:

(2) 启动文件launch.json配置如下:

 "version": "0.2.0","configurations": [{"name": "debug_master", "type": "cppdbg","request": "launch","program": "${workspaceFolder}/nginx/bin/sbin/nginx", "args": ["-c", "${workspaceFolder}/nginx/bin/conf/nginx.conf"],"stopAtEntry": false,"cwd": "${workspaceFolder}", "environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}]}]
}

效果如下:

 3.调试work进程

启动文件launch.json配置如下:


{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{ "name": "debug_worker","type": "cppdbg","request": "attach","program": "${workspaceFolder}/nginx/bin/sbin/nginx","processId": "28759",  "MIMode": "gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}]}]
}

注意:此处是以gdb attach的方式来调试运行中的进程,需要先使用ps查看nginx woker进程的pid,然后再attach上去,如上图显示work进程id为28759,launch.json文件中的processId也要是28759。

work进程调试效果如下:

在右侧可以看到函数调用栈帧信息

疑问:

我在如下两个函数设置断点:

static void

ngx_http_wait_request_handler(ngx_event_t *rev);

ngx_int_t

ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b);

1.刷新网页调用堆栈如下

//先停顿388行
ngx_http_wait_request_handler(ngx_event_t * rev) (/home/baidu123/Downloads/nginx-1.22.1/src/http/ngx_http_request.c:388)
ngx_epoll_process_events(ngx_cycle_t * cycle, ngx_msec_t timer, ngx_uint_t flags) (/home/baidu123/Downloads/nginx-1.22.1/src/event/modules/ngx_epoll_module.c:901)
ngx_process_events_and_timers(ngx_cycle_t * cycle) (/home/baidu123/Downloads/nginx-1.22.1/src/event/ngx_event.c:248)
ngx_worker_process_cycle(ngx_cycle_t * cycle, void * data) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:721)
ngx_spawn_process(ngx_cycle_t * cycle, ngx_spawn_proc_pt proc, void * data, char * name, ngx_int_t respawn) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process.c:199)
ngx_start_worker_processes(ngx_cycle_t * cycle, ngx_int_t n, ngx_int_t type) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:344)
ngx_master_process_cycle(ngx_cycle_t * cycle) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:130)
main(int argc, char * const * argv) (/home/baidu123/Downloads/nginx-1.22.1/src/core/nginx.c:383)//后停顿135行
ngx_http_parse_request_line(ngx_http_request_t * r, ngx_buf_t * b) (/home/baidu123/Downloads/nginx-1.22.1/src/http/ngx_http_parse.c:135)
ngx_http_process_request_line(ngx_event_t * rev) (/home/baidu123/Downloads/nginx-1.22.1/src/http/ngx_http_request.c:1085)
ngx_http_wait_request_handler(ngx_event_t * rev) (/home/baidu123/Downloads/nginx-1.22.1/src/http/ngx_http_request.c:503)
ngx_epoll_process_events(ngx_cycle_t * cycle, ngx_msec_t timer, ngx_uint_t flags) (/home/baidu123/Downloads/nginx-1.22.1/src/event/modules/ngx_epoll_module.c:901)
ngx_process_events_and_timers(ngx_cycle_t * cycle) (/home/baidu123/Downloads/nginx-1.22.1/src/event/ngx_event.c:248)
ngx_worker_process_cycle(ngx_cycle_t * cycle, void * data) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:721)
ngx_spawn_process(ngx_cycle_t * cycle, ngx_spawn_proc_pt proc, void * data, char * name, ngx_int_t respawn) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process.c:199)
ngx_start_worker_processes(ngx_cycle_t * cycle, ngx_int_t n, ngx_int_t type) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:344)
ngx_master_process_cycle(ngx_cycle_t * cycle) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:130)
main(int argc, char * const * argv) (/home/baidu123/Downloads/nginx-1.22.1/src/core/nginx.c:383)

2.nginx内部自动执行,只停顿到388行

ngx_http_wait_request_handler(ngx_event_t * rev) (/home/baidu123/Downloads/nginx-1.22.1/src/http/ngx_http_request.c:388)
ngx_event_expire_timers() (/home/baidu123/Downloads/nginx-1.22.1/src/event/ngx_event_timer.c:94)
ngx_process_events_and_timers(ngx_cycle_t * cycle) (/home/baidu123/Downloads/nginx-1.22.1/src/event/ngx_event.c:261)
ngx_worker_process_cycle(ngx_cycle_t * cycle, void * data) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:721)
ngx_spawn_process(ngx_cycle_t * cycle, ngx_spawn_proc_pt proc, void * data, char * name, ngx_int_t respawn) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process.c:199)
ngx_start_worker_processes(ngx_cycle_t * cycle, ngx_int_t n, ngx_int_t type) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:344)
ngx_master_process_cycle(ngx_cycle_t * cycle) (/home/baidu123/Downloads/nginx-1.22.1/src/os/unix/ngx_process_cycle.c:130)
main(int argc, char * const * argv) (/home/baidu123/Downloads/nginx-1.22.1/src/core/nginx.c:383)

nginx系列第二篇:nginx源码调试相关推荐

  1. Nginx实战基础篇一 源码包编译安装部署web服务器

    Nginx实战基础篇一 源码包编译安装部署web服务器 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览.表演.放映.广播或通 ...

  2. nginx 源码调试

    nginx 源码调试 这段时间正在学习nginx源码,看到一贴子的提问 (帖子:http://www.oschina.net/question/2711991_2165566?p=1#AnchorAn ...

  3. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  4. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

  5. Flutter Engine C++ 源码调试初探

    原文:https://fucknmb.com/2019/12/06/Flutter-Engine-C-%E6%BA%90%E7%A0%81%E8%B0%83%E8%AF%95%E5%88%9D%E6% ...

  6. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  7. Android FrameWork学习(二)Android系统源码调试

    点击打开链接 通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作. 为了更进一步地学习跟研究 Android ...

  8. 【深入浅出MyBatis系列十一】缓存源码分析

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 深入浅出MyBatis系列 [深入浅出MyBatis系列一]MyBatis入门 [深入浅出MyBatis系列二]配置 ...

  9. java计算机毕业设计的健身房管理系统MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计的健身房管理系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计的健身房管理系统MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构:B ...

最新文章

  1. 重磅!阿里开源AI核心技术,95%算法工程师受用
  2. 设计模式学习 之 单例模式
  3. php邮件通知,邮件通知设置
  4. 找出占用磁盘空间最大的前10个文件或文件夹
  5. highslide使用笔记
  6. pandas添加一行数据_恨晚,Python探索性数据分析神器pandas-profiling,一行代码搞定...
  7. c语言字符串文库总结,C语言程序设计入门:字符串函数
  8. mongodb更新操作符$inc,$mul
  9. poi导出excel日期格式问题
  10. java 反编译 class_反编译class文件并重新编译的方法
  11. H5动画实现简单的转盘抽奖。
  12. 音视频中的码率控制(CBR、VBR、CVBR、FIXQP)
  13. 需求调第四篇--常用的调研工作方法
  14. 【愚公系列】2023年02月 WMS智能仓储系统-010.全局过滤、中间件、格式化配置
  15. Qt开发技术:Qt富文本(一)富文本介绍、文档结构
  16. JAVAEE真实课堂系列之Struts2框架-刘志远-专题视频课程
  17. shp转txt获取其坐标点(可批量操作)
  18. 微信小程序 自定义搜索框并关键字高亮
  19. WVS安全测试工具使用教程
  20. 用python显示出所有能被17整除的三位数_小学弟敲了一个晚上整理的Python初学者习题,给你们学习!...

热门文章

  1. inceptor-pl/sql和sql的交互(db2方言)
  2. 网工内推 | 应届生网工专场,最高15薪,有NP以上证书优先
  3. 又一款网盘倒闭了!压根儿不赚钱~(附all开源网盘)
  4. 全篇干货系统集成项目管理工程师经验
  5. 成为杰出人物的路线图_如何成为杰出的初级开发人员
  6. 计算机应用的程序,计算机应用程序
  7. javascript学习指南——先导片
  8. 深入浅出Python机器学习4——广义线性模型
  9. 即时通讯开发实时音频的混音如何在视频直播中实现
  10. H5 页面设置了字体的粗细样式,但是在华为手机里微信打开访问样式不生效?