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閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容