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

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

熟悉gdb的使用

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

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

下载nginx源码

这里使用nginx-1.0.14

src是源代码,auto文件夹是configure运行时候的各种命令集合

修改config并编译

由于gdb需要gcc的时候加上-g参数,这样生成的文件才能使用gdb调试,因此我们要对源码做一下小改动

修改auto/cc/conf文件 ngxcompileopt="-c"

变为

ngxcompileopt="-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)

启动调试

[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 30721

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

ptrace: Operation not permitted.

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

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

参考资料:

gdb调试nginx的helloworld

Debugging Forks

Nginx源码阅读笔记

原文地址:

nginx模块_使用gdb调试nginx源码的更多相关文章

  1. Linux+eclipse+gdb调试postgresql源码

    pg内核源码解析课上用的vs调试pg源码, VS用起来确实方便,但是配置调试环境着实有点麻烦.首先得装个windows系统,最好是xp,win7稍微麻烦点:最好使用vs05,08和10也可以,但是比0 ...

  2. GDB调试qemu源码纪录

    今天介绍下如何利用gdb调试qemu 1.首先获取qemu源码 获取地址:https://www.qemu.org/ 2.编译安装qemu 进入qemu目录 ./configure --enable- ...

  3. 修改,编译,GDB调试openjdk8源码(docker环境下)

    在上一章<在docker上编译openjdk8>里,我们在docker容器内成功编译了openjdk8的源码,有没有读者朋友产生过这个念头:"能不能修改openjdk源码,构建一 ...

  4. Nginx学习之十四-GDB调试Nginx初试

    本文的测试环境: Win7+虚拟机VMWareVMware-workstation-full-7.1.4-385536+Ubuntu12.04 Nginx-1.4.0 要想有效的研究Nginx源码,必 ...

  5. linux下使用gdb对php源码调试

    title: linux下使用gdb对php源码调试 date: 2018-02-11 17:59:08 tags: --- linux下使用gdb进行php调试 调试了一些php的漏洞,记录一下大概 ...

  6. Android动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

  7. netbeans工具使用xdebug断点调试php源码

    对有有经验的程序员,使用echo.print_r().print_f().var_dump()等函数足以调试php代码,如果需要在IDE工具中使用断点调试,xdebug就是一个非常好的php调试工具. ...

  8. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  9. erlang下lists模块sort(排序)方法源码解析(一)

    排序算法一直是各种语言最简单也是最复杂的算法,例如十大经典排序算法(动图演示)里面讲的那样 第一次看lists的sort方法的时候,蒙了,几百行的代码,我心想要这么复杂么(因为C语言的冒泡排序我记得不 ...

随机推荐

  1. BZOJ1937 [Shoi2004]Mst 最小生成树

    首先由贪心的想法知道,树边只减不加,非树边只加不减,令$w_i$表示i号边原来的边权,$d_i$表示i号边的改变量 对于一条非树边$j$连接着两个点$x$.$y$,则对于$xy$这条路径上的所有树边$ ...

  2. Centos 6.2 安装mysql5.5

    1.  安装mysql 相关依赖库(没有的话就安装,有就不用安装了) 通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装. gcc* gcc-c++* autoconf* ...

  3. tomcat 下虚拟机部署导致应用filter失效的问题

    遇到一个困扰我两天的问题 服务器的tomcat上面挂了3个项目 1个项目在D:\tomcat\\webapps\ROOT下  运行正常 1个项目在D:\heyefan下 运行正常 1个项目在D:\MA ...

  4. Matcher类:(转)

    Matcher类:     使用Matcher类,最重要的一个概念必须清楚:组(Group),在正则表达式中 ()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的, 以及这 ...

  5. php的两个符号@和&---php总会要知道的系列

    在写代码的时候,碰到了在函数和变量前家 @和$的的问题,于是就借这个机会,学习下php的传值和传引用这两种方式 首先 @ 运算符只对表达式有效.对新手来说一个简单的规则就是:如果能从某处得到值,就能在 ...

  6. 西天取经第一步——制作自己的HTML5游戏

    废话不说,直入主题:这是一个休闲益智类游戏,与愤怒的小鸟类似采用Box2dWeb引擎.再开发游戏之前,首先我要把Box2dWeb给总结一下方便以后调用 大家可以在http://code.google. ...

  7. hdu 4619 Warm up 2

    http://acm.hdu.edu.cn/showproblem.php?pid=4619 根据题意可知,每一个方格可能只被一个骨牌覆盖 可能被两个骨牌覆盖 也可能不被覆盖 有一个骨牌覆盖的方格(单 ...

  8. 编码为multipart/form-data自定义类型(包括文件)如何自动绑定到webapi的action的参数里

    application/x-www-form-urlencoded与 multipart/form-data: Fom表单中如果没有type=file的控件,用默认的application/x-www ...

  9. [开发笔记]-FireWorks常用操作快捷键

    一.工具快捷键 指针.选择后方对象[V],[0] 部分选定[A],[1] 选取框.椭圆选取框[M] 套索.多边形套索[L] 裁剪.导出区域[C] 魔术棒[W] 线条工具[N] 钢笔工具[P] 矩形.圆 ...

  10. 如何在redhat下安装办公软件(openoffice)

    在redhat的client版本中自带有办公软件libreoffice,而在server版的redhat中却没有自带的办公软件,那么,如何在redhat的server版下安装办公软件呢? 方法一:配置 ...