nginx模块_使用gdb调试nginx源码-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

nginx模块_使用gdb调试nginx源码

简介:

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

ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正。

熟悉gdb的使用

这里就不说了,谷歌一搜一堆,这里推荐一篇文章:GDB 命令详细解释

请重点看一下step,run,break,list,info,continue命令

下载nginx源码

这里使用nginx-1.0.14

clip_image001

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

clip_image001[6]

确认已经加上了-g,

make

生成可执行文件

clip_image002

至此,nginx可执行文件已经成功编译了。

生成gdb所需要的core文件

gdb的core文件是为了保证在调试过程中遇到问题可以随时重新启动调试进程,更便于调试。

启动nginx

在objs目录下 ./nginx

ps aux|grep nginx

clip_image003

看到nginx启动了一个master进程(18237)和一个worker进程(18238)

在objs目录下运行命令

gcore 18237

clip_image004

看到core.188237生成了。

杀死nginx进程,包括master和worker

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

启动调试

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

此时进入gdb模式

clip_image005

gdb打断点并调试

使用l(list)命令查看main 函数,这个main函数是在src/core/nginx.c里面,是nginx的入口函数

(gdb) l #列出源文件,只列出10行,请使用l- 和 l 或者l +行号 或者 l +函数名 进行定位

(gdb) break 215 #在哪行打断点

(gdb) r #run,从main函数开始运行程序

clip_image006

此时进入另一个终端查看进程情况

clip_image007

看到已经启动了一个nginx了

此时在gdb中就可以进行调试了

clip_image008

下面就使用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

clip_image009

当使用attach pid进入某个进程的时候出现错误

(gdb) attach 30721

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

ptrace: Operation not permitted.

这个错误是由于有其他gdb也在调试这个进程

请确定是否有另外的终端或者另外的同事在gdb这个进程

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: