Nginx在Mac下的调试
作者原创,转载请联系作者
一 Nginx简介
Nginx("engine x") 是一个高性能的HTTP和反向代理器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx的设计优点自不必多说,其实现的代码也非常优秀。Nginx完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。
关于Nginx设计,有兴趣可以参考《深入理解Nginx --模块开发与架构解析》
二 Nginx编译安装
1. 相关基础软件安装
由于nginx在编译时默认的 http rewrite(使用正则表达式对请求进行重写) 模块依赖PCRE(Perl Compatible Regular Expressions)库,官网:http://www.pcre.org,所以需要先安装PCRE。如果没有安装PCRE,如果未安装,编译时会提示如下:
sh configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
安装PCRE的命令如下:
tar xvzf pcre-8.33.tar.gz
cd pcre-8.12
sudo ./configure --prefix=/usr/local
sudo make
sudo make install
2. Nginx编译安装
安装nginx大致是过程,
$ tar xvzf nginx-1.11.6.tar.gz
$ cd nginx-1.11.6
$ sudo sh configure
$ sudo make
$ sudo make install
安装简介如下:
Configuration summary
using system PCRE library
OpenSSL library is not used
md5: using system crypto library
sha1: using system crypto library
using system zlib library
......
三 Nginx调试
1. GDB简介
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
GDB可以在命令行进行调试,GDB常用命令:
命令 | 描述 |
---|---|
backtrace(或bt) | 查看各级函数调用及参数 |
finish | 连续运行到当前函数返回为止,然后停下来等待命令 |
frame(或f) 帧编号 | 选择栈帧 |
info(或i) locals | 查看当前栈帧局部变量的值 |
list(或l) | 列出源代码,接着上次的位置往下列,每次列10行 |
list 行号 | 列出从第几行开始的源代码 |
list 函数名 | 列出某个函数的源代码 |
next(或n) | 执行下一行语句 |
print(或p) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
quit(或q) | 退出gdb调试环境 |
set var | 修改变量的值 |
start | 开始执行程序,停在main函数第一行语句前面等待命令 |
step(或s) | 执行下一行语句,如果有函数调用则进入到函数中 |
2. 调试准备工作
1, 修改nginx源代码目录下子目录/auto/cc中的conf文件,将ngx_compile_opt="-c"改为ngx_compile_opt="-c -g"
2, 在编译的时候加上debug选项,nginx的安装脚本如下:
./configure --user=www --group=www --prefix=/export/lx/servers/nginx-debug --add-module=../ngx_cache_purge-1.2 --with-debug --with-pcre --with-http_sub_module --with-http_stub_status_module --with-http_ssl_module
make -j 4
make install
3,修改安装完毕之后生成的nginx配置文件:nginx.conf,加入error_log /export/lx/servers/nginx_debug/logs/error.log debug;配置项如果是做模块开发,则需要将nginx设置为单进程模式才可以调试开发的模块中的代码加入如下几句配置项:
worker_processes 1;
master_process off; # 单进程模式
daemon off;
3.采用GDB调试Nginx
1, 首先我们切换工作目录至:.../nginx-1.11.9.-/objs/,然后在终端中启动GDB调试器:
sudo gdb -q -tui(q选项是以安静模式启动,不显示GDB版本等信息。tui选项可以显示代码界面)
2, 在GDB中启动nginx:
shell ./nginx
3, 在shell下查看nginx的进场号
ps -ef | grep nginx
4, attach命令来跟踪子进程
attach Pid
5, 使用GDB的命令进行调试,如我们知道,子进程即worker进程在运行后会停留在epoll_wait处等待相应的事件发生,而这个函数调用被封装在ngx_process_events_and_timers 中。于是我们在这个函数出设置一个断点:b ngx_process_events_and_timers,然后采用命令c,使得nginx一直运行,直到遇到第一个断点。
6, 示范图如下:
3.采用Xcode调试Nginx
目前nginx是使用makefile进行工程管理,而C/C++的编程利器Clion只支持CMake,还不支持makefile。而Clion自带生成CMakefile.txt还不能从Nginx的makefile自动转换Cmakefile.txt,因此Clion无法使用。
而在Mac下,开发C语言的利器是XCode,故下面讲解Xcode如何导入Nginx代码,并进行调试代码。
1,新建项目,选择Command Line Tool。(其实选择其他都可以,不过千万别选择External build system ,因为如果选择了这个,将会失去智能提示与定义跳转)。
2,按Next,然后选择目录,我选择在原有的软件Ngin目录下,Nginx会自动Nginx目录下创建一个与项目名称相同的目录。千万别别与原来的软件在同一目录下并和原有软件相同的名字,要不然xcode会把原来的目录内容删除。
3, 添加项目的所有文件到xcode 项目中。请记得选择(Create groups for any added folders),要不然加入项目后的文件。不能做智能提示和跳转定义。做不了这些功能的还要IDE干嘛,直接用sublime就好了。是否选择使用Copy items into destination group’s folder(if needed),这个根据你项目存放路径和需要。
4, 在项目中点击“Add Target…”
Paste_Image.png
5, 选择“External Build System” ,然后填写内容。点击Finish。后,需要在nginx这个target的setting做设置,主要是Directory这个目录。需要填写你项目的makefile所在的路径。如果你的makefile与你的xcode project文件同一路径是不需要更改。由于我的makefile在project文件的上一层目录,所以使用了”../”。也可以使用绝对路径,不过还是建议使用相对路径比较好。这时候就设置好了,可以选择tager Nginx进行编译运行。
6, 在编译的时候如果发现有错误,不能点击错误,定位到错误在什么文件与那一行。这个是路径的问题。我编译的时候是在最上层的makefile,而makefile是通过cd命令进入各个目录中,再进行make的命令操作。所以xcode不知道是那个目录下有该文件,只会在根makefile所在的目录下进行寻找。解决方法是:新添加多一个target–nginx,nginx的Makefile Directory指向../nginx/。
7, 想要单步调试,经过摸索发现,可在debug->attach to process by Pid or Name ,然后填写nginx或者nginx的Pid,这样就可以进行单步调试了
8, 然后采用step over, step in可以单步跟踪,在调试框里面有自动变量值显示,在concle中可以采用GDB的相关命令进行操作,比如打印 p 变量名等,见下图:
9, 然后各位就根据自己的需要进行调试各个流程!