继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

nginx学习- 开篇,搭建调试环境

慕姐8265434
关注TA
已关注
手记 1305
粉丝 222
获赞 1065

搭建调试环境

首先还是搭个调试环境,下好了nginx代码以后,查看目录。

localhost:nginx-master jjchen$ tree -L 1.
├── Makefile
├── auto├── conf
├── contrib
├── docs
├── misc
├── objs
└── src

直接编译

bash auto/configure

make

程序就编译好了,可执行程序生成在objs/nginx。

代码在src中,我们用ide将代码导入,我这里是xcode。此处直接导入代码,没有处理编译错误,不能直接debug运行了,我们直接用附加程序的方式来调试。注意先附加到进程,后启动程序。

进入objs目录,启动nginx程序,这里用了root权限,不然一些日志文件创建不了。

sudo ./nginx -c ../conf/ngin.conf

开始跟踪代码。--- 发现了大问题,debug的堆栈信息好像不准,而且IDE内函数不能跳转。。
看来不能偷懒了,还是回到开头,修改配置,修改代码让IDE能直接Debug起来;整个过程花了我两个多小时。记录一下避免后人踩坑。

有几个步骤。

1.加入头文件路径,这个在makefile文件可以找到。

    -I src/core \
    -I src/event \
    -I src/event/modules \
    -I src/os/unix \
    -I objs \
    -I src/http \
    -I src/http/modules

2.1 直接删掉其他平台的代码,比如win,linux非macos部分。

2.2 删掉其他makefile文件中没有的.c、.cpp文件。这个还是写个程序来做吧,如下。

import java.io.*;import java.nio.CharBuffer;import java.util.*;public class FilterCppsInMakefile {    private static String srcRoot = "/Users/jjchen/cpro/nginx-test/src";    private static String MakefilePath = "/Users/jjchen/cpro/nginx-master/objs/Makefile";    private static Map<String,String> cppFiles = new HashMap<>();    public static void GetCppFiles(String dirPath){
        File dir = new File(dirPath);        if (!dir.isDirectory()){            throw new RuntimeException("can not read path: "+dirPath);
        }

        File []srcs = dir.listFiles(new FileFilter() {            @Override
            public boolean accept(File pathname) {                if (pathname.isDirectory()){
                    GetCppFiles(pathname.getPath());                    return false;
                }                return pathname.getName().endsWith(".c")||pathname.getName().endsWith(".cpp");
            }
        });        for (File src: srcs){
            cppFiles.put(src.getName().replace(".c","").replace(".cpp",""),src.getAbsolutePath());
        }
    }    public static String read (String filePath)throws Exception{
        Reader reader = new BufferedReader(new FileReader(filePath));
        StringBuilder stringBuilder = new StringBuilder();

        String part = "";        while((part =((BufferedReader) reader).readLine())!= null){
            stringBuilder.append(part);
        }        return stringBuilder.toString();


    }    public  static void deleteSrcFiles(List<String>fileList){        for(String fileName : fileList) {            for (int i=0; i<2;i++){
                File file = new File(fileName);                if (!file.exists()) {                    continue;
                } else {                    if (file.isFile())
                        file.delete();
                }                //同时删除头文件
                fileName = fileName.replace(".cpp",".h").replace(".c",".h");
            }

        }


    }    public static void main(String[] args) {
        GetCppFiles(srcRoot);
        String content = "";        try {
            content = read(MakefilePath);
        } catch (Exception e) {
            e.printStackTrace();            return;
        }
        System.out.println(cppFiles.toString());
        List<String> delList= new ArrayList<>();
        Iterator<HashMap.Entry<String,String>> iterator = cppFiles.entrySet().iterator();        while (iterator.hasNext()){
            HashMap.Entry<String,String> node = iterator.next();            if(!content.contains(node.getKey())){
                delList.add(node.getValue());
            }
        }
        System.out.println(cppFiles.size());
        System.out.println(Arrays.toString(delList.toArray()));
        deleteSrcFiles(delList);




    }
}
  1. 导入正则的库,我本地的头文件 /usr/local/Cellar/pcre/8.41/include/,静态库libpre.a;

  2. 执行完make以后,将objs文件夹下的ngx_modules.c文件和两个头文件拷入代码。

做完这些就可以正常启动了。去掉空的文件夹只剩下如下的模块。

webp

image.png



作者:msrpp
链接:https://www.jianshu.com/p/2eeb83bb8e68


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP