第一篇将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. Scrapy:python3下的第一次运行测试
  2. Struts2笔记——第一个实例HelloWorld
  3. 【OpenGL】四、Visual Studio 2019 配置 GitHub ( 从 GitHub 上克隆项目 )
  4. pascal--生成Pascal矩阵
  5. c++ string 头文件_“延期不延学” 第25期 | C++篇 | C/C++常用函数
  6. 最简单实现多线程的方法(Thread)
  7. ArrayList 除重
  8. 接口中定义的成员变量是( )。_抽象与接口
  9. 小学计算机课5年级第一课,人教版(2015)小学信息技术 五年级下册 第1课 录制声音真轻松 教案...
  10. C++ Vector详解
  11. 计算机科学与技术毕业生简历,计算机科学与技术专业应届毕业生简历范文
  12. 学习C++项目——select模型,poll模型和epoll模型
  13. 二进制文件与文本文件详解
  14. 小米更新显示非官方rom_MIUI官改篇对比分析-极光ROM-台湾W大-星空未来-其他官改官网...
  15. android黑域系统文件,优雅地使用安卓手机,黑域免root使用教程
  16. 汇编语言学习:如何理解“物理地址=段地址X16+偏移地址”
  17. MathType中如何实现上下两行公式“=”号对齐
  18. 烤仔的朋友们 | 一文告诉你,什么是加密艺术?
  19. 【转载】Oracle字符集子集与超级的对应关系
  20. 11g rman 配置catalog

热门文章

  1. 【IT之路】微信小程序之初探
  2. 计算机应用的程序,计算机应用程序
  3. centos或者unbantu搭建minio
  4. Android SeekBar控件
  5. DXC简介——HANA数据抽取和同步
  6. Python通过Django搭建网站执行Lua脚本 (实现数据解析)
  7. 【OverFeat】Integrated Recognition, Localization and Detection using Convolutional Networks(2014) 全文翻译
  8. vc2010重装问题
  9. 微信小程序 python社区废品回收系统java php
  10. vp230引脚功能_SN65HVD230真正中文资料_应用必备