工欲善其事必先利其器,如何使用调试工具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文件

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)

启动调试

[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这个进程

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

nginx模块_使用gdb调试nginx源码相关推荐

  1. vuex commit 模块_长篇连载:Vuex源码学习(二)脉络梳理

    前车之鉴 有了vue-router源码学习的经验,每次看认真钻研源代码的时候都会抽出一小段时间来大体浏览一遍源代码.大体了解这个源代码的脉络,每个阶段做了什么,文件目录的划分.下面我来带大家梳理一下V ...

  2. gdb调试,GDB调试opencore源码

    http://www.crazycoder.cn/Bo-abstracts-selected/Article115650.html 花了一天的时间终于用GDB实现了对opencore的调试,虽然网上高 ...

  3. gdb 调试_GDB调试指南-源码查看

    前言 我们在调试过程中难免要对照源码进行查看,如果已经开始了调试,而查看源码或者编辑源码却要另外打开一个窗口,那未免显得太麻烦.文本将会介绍如何在GDB调试模式下查看源码或对源码进行编辑. 准备工作 ...

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

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

  5. Linux LNMP源码架构部署 | Nginx服务 | Mysql服务 | php服务 | 论坛源码编译安装 | 超详细

    | Nginx服务 | Mysql服务 | php服务 | 论坛源码编译安装 | ➤安装 Nginx 服务 ➤1.关闭防火墙和安全机制 ➤2.卸载自带的httpd服务 ➤3.安装依赖包 ➤4.创建运行 ...

  6. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

  7. linux下 如何调试php,linux下使用gdb对php源码调试

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

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

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

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

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

最新文章

  1. MYSQL 如果把数据文件保存到其他磁盘里
  2. C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove
  3. python中eps参数_2019-01-23 python PIL 编辑 EPS 文件调整大小并拼接-失败告终
  4. 南工程c语言实验报告,Linux环境下-C语言编程实验报告(1)(总4页).doc
  5. TensorFlow在美团外卖推荐场景的GPU训练优化实践
  6. calendar类_不要再自己写 Java 工具类了,这些开源的不香吗?
  7. 非连续内存区缺页异常处理
  8. 从零开始搭二维激光SLAM --- 总结
  9. 前轮转向最大角度设计原来_转向系统的工作原理
  10. HTML元素居中的方法
  11. 信息系统规划方法-关键成功因素法(CSF)
  12. 《微观经济学》 第九章
  13. 温莎大学的计算机科学,温莎大学 University of Windsor
  14. 叁-拾玖|c++入门笔记
  15. 数据结构的大体学习框架
  16. Matlab中(),[],与{}的用法区别
  17. 锐龙r75800H和酷睿i71165G7 选哪个好
  18. diy无感无刷电机霍尔安装_无刷直流电机霍尔传感器安装方法研究
  19. java内存 phd文件抓取,WAS 常常有heapdump.phd和javacore.txt文件产生
  20. 小i机器人2019数博会C位秀肌肉 “认知智能”引领行业创新变革

热门文章

  1. 如何判断一个点是否在三角形内部
  2. Qomolangma实现篇(四):基本特性增强与多投事件系统
  3. 解决PyCharm中报出 “Instance attribute xxx defined outside __init__“ 的警告
  4. Linux(二)——基础入门(2)
  5. 计算机进桌面后反复重启,我的电脑一插网线就自动重启。到界面之后又马上重启。一直循环。...
  6. 图像处理--线line 提取
  7. context root修改无效:web修改项目路径(eclipse)
  8. 北斗导航 | 卫星导航基础知识(卫星导航时间系统)
  9. Qt学习(一):两个独立窗口的信号通信
  10. 回调函数案列(C高级)