理解Nginx源码

MacOS中使用VSCode调试Nginx

2018-12-20  本文已影响31人  seawish

一. 编译运行Nginx

详细过程可参考博文:Nginx源码编译安装教程

配置调试功能

一定要开启Nginx调试功能:

修改 ./auto/cc/conf :
ngx_compile_opt="-c" 改为 ngx_compile_opt="-c -g"

安装Nginx

cd nginx-1.10.3
sudo ./configure --prefix=/usr/local/nginx --with-stream --with-debug 
sudo make
sudo make install

更改Nginx程序目录权限

必须修改文件夹权限,要不然VScode将没有权限启动Nginx。
Nginx安装目录为configure命令中--prefix所设置的目录:

sudo ./configure --prefix=/usr/local/nginx --with-stream --with-debug 

修改文件夹权限:

chmod -R 777 /usr/local/nginx

配置nginx.conf

需要关闭Nginx守护进程运行方式,从而保证每次关闭debugger都能关闭nginx服务。

在/conf/nginx.conf 中修改如下:

daemon off;
#master_process off;
worker_processes  1;

二. 调试Master进程

1. 添加VSCode调试配置

在Nginx中打开Nginx源码,并添加调试配置,如下图。

image.png

2. 修改launch.json

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        // 调试nginx Master进程
        {
            "name": "(lldb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/objs/nginx",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "lldb"
        }
    ]
}

3. 启动调试

image.png

三. 调试Worker进程

1. 查看Worker进程id

zsbmac% ps -ef | grep nginx
 502 80322 80311   0  8:27下午 ttys008    0:00.00 grep nginx
 502 80316 80318   0  8:27下午 ttys009    0:00.01 nginx: master process /Users/zsb/Documents/Workspaces/nginx-dev/nginx-1.10.3/objs/nginx
 502 80320 80316   0  8:27下午 ttys009    0:00.00 nginx: worker process

2. 编辑launch.json

增加工作进程的调试配置:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [

        // 监听工作进程
        { 
            "name": "(lldb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "program": "${workspaceFolder}/objs/nginx",
            "processId": "80320", // 填写 Worker 进程 PID
            "MIMode": "lldb"
        },
        // 启动nginx
        {
            "name": "(lldb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/objs/nginx",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "lldb"
        }
    ]
}

3. 切换debug模式为attach

image.png

4. 断点调试,在解析 Http 请求处打断点,刷新浏览器

image.png

参考文献


本文作者: seawish
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

上一篇 下一篇

猜你喜欢

热点阅读