1. 程式人生 > >nginx模組_使用gdb除錯nginx原始碼

nginx模組_使用gdb除錯nginx原始碼

轉載地址:https://www.cnblogs.com/yjf512/archive/2012/05/10/2494635.html

工欲善其事必先利其器,如何使用除錯工具一步步除錯nginx是瞭解nginx的重要手段。

熟悉gdb的使用

這裡就不說了,谷歌一搜一堆,這裡推薦一篇文章:GDB 命令詳細解釋

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

下載nginx原始碼

這裡使用nginx-1.0.14

src是原始碼,auto資料夾是configure執行時候的各種命令集合

修改config並編譯

由於gdb需要gcc的時候加上-g引數,這樣生成的檔案才能使用gdb除錯,因此我們要對原始碼做一下小改動

修改auto/cc/conf檔案

ngx_compile_opt="-c"

變為

ngx_compile_opt="-c -g"

執行configure

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

確認

發現多出了objs資料夾,裡面有Makefile檔案

確認一下-g引數是否加上了

vim objs/Makefile

確認已經加上了-g,

make

生成可執行檔案

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

生成gdb所需要的core檔案

gdb的core檔案是為了保證在除錯過程中遇到問題可以隨時重新啟動除錯程序,更便於除錯。

啟動nginx

在objs目錄下 ./nginx

ps aux|grep nginx

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

在objs目錄下執行命令

gcore 18237

看到core.188237生成了。

殺死nginx程序,包括master和worker

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

啟動除錯

[[email protected]

objs]# gdb ./nginx core.18237

此時進入gdb模式

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中就可以進行除錯了

下面就使用next和step一步一步進行除錯吧

除錯中可能遇到的問題

nginx是master-worker模式,當fork出現子程序的時候如何進入子程序呢?

(gdb)set follow-fork-mode child

這個命令可以是

set follow-fork-mode parent

set follow-fork-mode child

請參考:Debugging Forks

print(p)能否打印出指標指向的內容呢?

(gdb)p *ptr

當使用attach pid進入某個程序的時候出現錯誤

(gdb) attach 30721

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

ptrace: Operation not permitted.

這個錯誤是由於有其他gdb也在除錯這個程序

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

參考資料:

gdb除錯nginx的helloworld

Debugging Forks

Nginx原始碼閱讀筆記