天天看點

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

工欲善其事必先利其器,如何使用調試工具gdb一步步調試nginx是了解nginx的重要手段。

ps:本文的目标人群是像我這樣初接觸unix程式設計的同學,如果有什麼地方錯誤請指正。

請重點看一下step,run,break,list,info,continue指令

這裡使用nginx-1.0.14

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

src是源代碼,auto檔案夾是configure運作時候的各種指令集合

由于gdb需要gcc的時候加上-g參數,這樣生成的檔案才能使用gdb調試,是以我們要對源碼做一下小改動

ngx_compile_opt="-c"

變為

ngx_compile_opt="-c -g"

./configure --prefix=/home/yejianfeng/nginx/

發現多出了objs檔案夾,裡面有makefile檔案

确認一下-g參數是否加上了

vim objs/makefile

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

确認已經加上了-g,

make

生成可執行檔案

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

至此,nginx可執行檔案已經成功編譯了。

gdb的core檔案是為了保證在調試過程中遇到問題可以随時重新啟動調試程序,更便于調試。

在objs目錄下 ./nginx

ps aux|grep nginx

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

看到nginx啟動了一個master程序(18237)和一個worker程序(18238)

gcore 18237

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

看到core.188237生成了。

./nginx -s stop(或者直接使用kill)

[root@localhost objs]# gdb ./nginx core.18237

此時進入gdb模式

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

使用l(list)指令檢視main 函數,這個main函數是在src/core/nginx.c裡面,是nginx的入口函數

(gdb) l #列出源檔案,隻列出10行,請使用l- 和 l 或者l +行号 或者 l +函數名 進行定位

(gdb) break 215 #在哪行打斷點

(gdb) r #run,從main函數開始運作程式

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

此時進入另一個終端檢視程序情況

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

看到已經啟動了一個nginx了

此時在gdb中就可以進行調試了

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

下面就使用next和step一步一步進行調試吧

(gdb)set follow-fork-mode child

這個指令可以是

set follow-fork-mode parent

set follow-fork-mode child

(gdb)p *ptr

nginx子產品_使用gdb調試nginx源碼熟悉gdb的使用下載下傳nginx源碼修改config并編譯生成gdb所需要的core檔案啟動調試gdb打斷點并調試調試中可能遇到的問題

(gdb) attach 30721

attaching to program: /data0/s/bin/s, process 30721

ptrace: operation not permitted.

這個錯誤是由于有其他gdb也在調試這個程序

請确定是否有另外的終端或者另外的同僚在gdb這個程序

繼續閱讀