centos7 clion nginx调试

NginX运维与开发宝典(第七篇:NginX源码开发基础)
https://edu.51cto.com/course/18013.html

安装centos7

版本CentOS-7-x86_64-DVD-2009.iso,镜像下载地址

安装nginx依赖

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel pcre pcre-devel

clion测试hello world

下载clion,解压进入bin目录,root运行clion.sh


建立一个c++ 14项目demo1,报

CMake Error at CMakeLists.txt:2 (project):
  No CMAKE_CXX_COMPILER could be found.

解决:

yum install -y build-essential

结果如果报:没有可用软件包 build-essential,运行如下命令

yum install make automake gcc gcc-c++ kernel-devel

运行程序成功输出hello world

nginx调试配置

cd /opt
mkdir code
cd code
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar -zxvf nginx-1.16.1.tar.gz 

cd nginx-1.16.1/
mkdir logs
./configure --prefix=/opt/code/nginx-1.16.1

vim makefile2cmakelist.py

makefile2cmakelist.py内容如下

#!/usr/bin/python
import os
import sys
import re

total_line = 0

def get_line_by_kw(file, ptn, key_word):
    r_cmd = os.popen(" ".join(["grep -n", key_word, file]))
    ret_s = r_cmd.readline()
    r_cmd.close()
    line_ptn = re.compile(ptn)
    line_s = line_ptn.search(ret_s).group()[:-1]
    return line_s

def write_a_line(write_l, content_str, line_start, line_end, tofile, postfix):
    global total_line
    if (write_l <= total_line):
        line = "sed -in \'%dc %s\' %s" %(write_l, content_str[line_start:line_end] + postfix, tofile)
    else:
        line = "sed -in \'%da %s\' %s" %(write_l - 1, content_str[line_start:line_end] + postfix, tofile)
    os.system(line)
    line = "sed -in \'%ds/^/        /\' %s" %(write_l, tofile)
    os.system(line)

def insert_a_line(insert_l, content_str, tofile):
    line = "sed -in \"%da %s\" %s" %(insert_l, content_str, tofile)
    os.system(line)

def write_header_to_cmake(start_line, content_list, tofile, toline):
    write_l = toline
    read_l = start_line

    write_a_line(write_l, content_list[read_l], len("XXXX_DEPS = "), -3, tofile, "")

    while True:
        if content_list[read_l][-2] == '\\':
            read_l += 1
            write_l += 1
            write_a_line(write_l, content_list[read_l], 1, -3, tofile, "")
        else:
            write_a_line(write_l, content_list[read_l], 1, -1, tofile, "")
            break
    return write_l

def write_dotc_set_clfags(start_line, content_list, fromfile, tofile, toline, set_n, cflag_n):
    write_l = toline
    read_l = start_line

    all_flags_l = list()

    while content_list[read_l][-2] == '\\':
        read_l += 1
        if '.o' in content_list[read_l]:
            if '.o' in content_list[read_l + 1]:
                if content_list[read_l].startswith("    objs/src"):
                    write_a_line(write_l, content_list[read_l], len("   objs/"), -4, tofile, "c")
                else:
                    if content_list[read_l].startswith("    objs/addon"):
                        addon_ln = int(get_line_by_kw(fromfile, r"^\d+:", content_list[read_l][1:-3] + ':'))
                        write_a_line(write_l, content_list[addon_ln], 1, -1, tofile, "")
                    else:
                        write_a_line(write_l, content_list[read_l], 1, -4, tofile, "c")
            else:
                if content_list[read_l].startswith("    objs/src") or content_list[read_l].startswith(" objs/addon"):
                    write_a_line(write_l, content_list[read_l], len("   objs/"), -4, tofile, "c)")
                else:
                    if content_list[read_l].startswith("    objs/addon"):
                        addon_ln = int(get_line_by_kw(fromfile, r"^\d+:", content_list[read_l][1:-3] + ':'))
                        write_a_line(write_l, content_list[addon_ln], 1, -1, tofile, "")
                    else:
                        write_a_line(write_l, content_list[read_l], 1, -4, tofile, "c)")
            write_l += 1
        else:
            if '-' in content_list[read_l]:
                if content_list[read_l].startswith('    '):
                    all_flags_l.append(content_list[read_l][1:-1].replace('\\', ''))
                else:
                    all_flags_l.append(content_list[read_l][:-1].replace('\\', ''))

    all_flags_l.append(content_list[cflag_n][len("CFLAGS = "): -1])
    print (" ".join(all_flags_l))
    set_line = r"set\(CMAKE_C_FLAGS \"\$\{CMAKE_C_FLAGS\} -L /usr/lib64/ %s\"\)" %(" ".join(all_flags_l))
    insert_a_line(set_n, set_line, tofile)
    line = "sed -in \"/add_executable/{x;p;x}\" %s" %(tofile)
    os.system(line)

    return write_l + 2

def set_include_directories(makefile, cmakelist):
    added_list = list()

    r_cmd = os.popen(' '.join(["grep -n include_directories", cmakelist]))
    inc_dir_l = r_cmd.readlines()
    r_cmd.close()

    line_ptn = re.compile(r"^\d+:")
    start_line_ns = line_ptn.search(inc_dir_l[0]).group()[:-1]
    start_line_n = int(start_line_ns)

    r_cmd = os.popen(' '.join(["grep -n \"I \"", makefile]))
    inc_path_l = r_cmd.readlines()
    r_cmd.close()
    inc_pth_ptn = re.compile(r"-I\s*\S+\b")

    insert_a_line(start_line_n, r"include_directories\(/usr/local/include\)", cmakelist)

    for item in inc_path_l:
        flag = 0
        pth_s = inc_pth_ptn.search(item).group()[3:].replace('\\', '')
        for inc_dir_item in inc_dir_l:
            if pth_s in inc_dir_item or pth_s in added_list:
                flag = 1
                break
        if flag == 0:
            added_list.append(pth_s)
            set_line = r"include_directories\(%s\)" %pth_s
            insert_a_line(start_line_n, set_line, cmakelist)

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "Error! Usage is ./makefile2cmakelist.py $(path)/Makefile $(path)/CMakeList"
        sys.exit()

    if False == os.path.isfile(sys.argv[1]) or False == os.path.isfile(sys.argv[2]):
        print "Error! Parameter should be a file!"
        sys.exit()
    else:
        if "Makefile" in sys.argv[1]:
            fm = 1
            if "CMakeList" in sys.argv[2]:
                fc = 2
            else:
                print("Error! There is no file named \"CMakeList\" in paramters!")
                sys.exit()
        else:
            if "Makefile" in sys.argv[2]:
                fm = 2
                if "CMakeList" in sys.argv[1]:
                    fc = 1
                else:
                    print("Error! There is no file named \"CMakeList\" in paramters!")
                    sys.exit()
            else:
                print("Error! There is no file named \"Makefile\" in paramters!")
                sys.exit()

    if False == os.path.isfile(sys.argv[fc] + '.bak'):
        line = "cp %s %s" %(sys.argv[fc], sys.argv[fc] + '.bak')
    else:
        line = "rm -rf %s; cp -rf %s %s" %(sys.argv[fc], sys.argv[fc] + '.bak', sys.argv[fc])
    os.system(line)

    line = "wc -l %s" %sys.argv[fc]
    r_cmd = os.popen(line)
    ret_s = r_cmd.readline()
    print "wc resault:"+ret_s[0:3]
    r_cmd.close()
    t_line_ptn = re.compile("^\d+\s")
    global total_line
    total_line = int(t_line_ptn.search(ret_s).group()[:-1])

    key_ns = get_line_by_kw(sys.argv[fm], r"^\d+:", "CORE_DEPS")
    print ("CORE_DEPS " + key_ns)
    core_deps_n = int(key_ns) - 1

    key_ns = get_line_by_kw(sys.argv[fm], r"^\d+:", "HTTP_DEPS")
    print ("HTTP_DEPS " + key_ns)
    http_deps_n = int(key_ns) - 1

    key_ns = get_line_by_kw(sys.argv[fm], r"^\d+:", "\(LINK\)")
    print ("LINK " + key_ns)
    dotc_n = int(key_ns) - 1

    key_ns = get_line_by_kw(sys.argv[fm], r"^\d+:", "\"CFLAGS =\"")
    print ("CFLAGS " + key_ns)
    cflag_n = int(key_ns) - 1

    key_ns = get_line_by_kw(sys.argv[fc], r"^\d+:", "add_executable")
    print ("add_executable " + key_ns)
    exe_n = int(key_ns) + 1

    mf = open(sys.argv[fm], "r+")

    df = mf.readlines()
    print(df[core_deps_n])
    print(df[http_deps_n])
    print(df[dotc_n])
    print(df[cflag_n])

    mf.close()

    old_exe_n = exe_n
    set_n = exe_n - 2
    exe_n = write_header_to_cmake(core_deps_n, df, sys.argv[fc], old_exe_n)
    old_exe_n = exe_n + 1
    exe_n = write_header_to_cmake(http_deps_n, df, sys.argv[fc], old_exe_n)
    old_exe_n = exe_n + 1
    exe_n = write_dotc_set_clfags(dotc_n, df, sys.argv[fm], sys.argv[fc], old_exe_n, set_n, cflag_n)

    line = "sed -in \'%d,$d\' %s" %(exe_n, sys.argv[fc])
    os.system(line)

    set_include_directories(sys.argv[fm], sys.argv[fc])


clion导入源码


执行命令

python makefile2cmakelist.py CMakeLists.txt objs/Makefile 

nginx.conf添加如下内容,使nginx单进程启动

daemon off;
master_process off;

启动项目,在ngx_http_core_module.c下ngx_http_handler方法中打断点


浏览器访问127.0.0.1


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容