nginx模块_使用gdb调试nginx源码
2017-06-10 08:59
232 查看
工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段。
ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正。
请重点看一下step,run,break,list,info,continue命令
src是源代码,auto文件夹是configure运行时候的各种命令集合
变为
ngx_compile_opt="-c -g"
确认一下-g参数是否加上了
vim objs/Makefile
确认已经加上了-g,
make
生成可执行文件
至此,nginx可执行文件已经成功编译了。
ps aux|grep nginx
看到nginx启动了一个master进程(18237)和一个worker进程(18238)
看到core.188237生成了。
此时进入gdb模式
(gdb) l #列出源文件,只列出10行,请使用l- 和 l 或者l +行号 或者 l +函数名 进行定位
(gdb) break 215 #在哪行打断点
(gdb) r #run,从main函数开始运行程序
此时进入另一个终端查看进程情况
看到已经启动了一个nginx了
此时在gdb中就可以进行调试了
下面就使用next和step一步一步进行调试吧
这个命令可以是
set follow-fork-mode parent
set follow-fork-mode child
请参考:Debugging Forks
Attaching to program: /data0/s/bin/s, process 30721
ptrace: Operation not permitted.
这个错误是由于有其他gdb也在调试这个进程
请确定是否有另外的终端或者另外的同事在gdb这个进程
ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正。
熟悉gdb的使用
这里就不说了,谷歌一搜一堆,这里推荐一篇文章:GDB 命令详细解释请重点看一下step,run,break,list,info,continue命令
下载nginx源码
这里使用nginx-1.0.14src是源代码,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目录下 ./nginxps aux|grep nginx
看到nginx启动了一个master进程(18237)和一个worker进程(18238)
在objs目录下运行命令
gcore 18237看到core.188237生成了。
杀死nginx进程,包括master和worker
./nginx -s stop(或者直接使用kill)启动调试
[root@localhost 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 30721Attaching to program: /data0/s/bin/s, process 30721
ptrace: Operation not permitted.
这个错误是由于有其他gdb也在调试这个进程
请确定是否有另外的终端或者另外的同事在gdb这个进程
相关文章推荐
- 使用gdb调试nginx源码
- nginx模块_使用gdb调试nginx源码
- nginx源码分析--使用GDB调试
- nginx模块_使用gdb调试nginx源码
- nginx源码分析--使用GDB调试
- nginx源码分析--使用GDB调试(strace、 pstack )
- nginx源码分析--使用GDB调试(strace、 pstack )
- Ubuntu和Mac使用gdbserver远程调试android源码
- Android无源码调试Native代码(使用GDB)
- nginx静态编译openssl并且使用gdb调试openssl
- 使用hello-gl2建立ndk-gdb环境(有源码和无源码调试环境)
- caffe使用gdb单步调试及源码阅读
- nginx模块_使用gdb调试nginx源码
- nginx模块_使用gdb调试nginx源码
- 在kali下使用gdb以源码方式调试glibc
- 使用GDB调试nginx
- 使用QT Creator查看并调试nginx源码
- nginx模块_使用gdb调试nginx源码
- nginx模块_使用gdb调试nginx源码
- Android无源码调试Native代码(使用GDB)