天天看点

nginx模块_使用gdb调试nginx源码熟悉gdb的使用下载nginx源码修改config并编译生成gdb所需要的core文件启动调试gdb打断点并调试调试中可能遇到的问题

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

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

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

这里使用nginx-1.0.14

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644521627.png"></a>

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

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644522433.png"></a>

确认已经加上了-g,

make

生成可执行文件

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644538463.png"></a>

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

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

在objs目录下 ./nginx

ps aux|grep nginx

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644535365.png"></a>

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

gcore 18237

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/20120510164454839.png"></a>

看到core.188237生成了。

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

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

此时进入gdb模式

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644558232.png"></a>

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

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

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

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

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644563706.png"></a>

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

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644566463.png"></a>

看到已经启动了一个nginx了

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

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644578590.png"></a>

下面就使用next和step一步一步进行调试吧

(gdb)set follow-fork-mode child

这个命令可以是

set follow-fork-mode parent

set follow-fork-mode child

(gdb)p *ptr

<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205101644578524.png"></a>

(gdb) attach 30721

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

ptrace: Operation not permitted.

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

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

本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2012/05/10/2494635.html,如需转载请自行联系原作者

继续阅读