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, 然后各位就根据自己的需要进行调试各个流程!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容