nginx模块_使用gdb调试nginx源码
工欲善其事必先利其器,如何使用调试工具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源码的更多相关文章
- Linux+eclipse+gdb调试postgresql源码
pg内核源码解析课上用的vs调试pg源码, VS用起来确实方便,但是配置调试环境着实有点麻烦.首先得装个windows系统,最好是xp,win7稍微麻烦点:最好使用vs05,08和10也可以,但是比0 ...
- GDB调试qemu源码纪录
今天介绍下如何利用gdb调试qemu 1.首先获取qemu源码 获取地址:https://www.qemu.org/ 2.编译安装qemu 进入qemu目录 ./configure --enable- ...
- 修改,编译,GDB调试openjdk8源码(docker环境下)
在上一章<在docker上编译openjdk8>里,我们在docker容器内成功编译了openjdk8的源码,有没有读者朋友产生过这个念头:"能不能修改openjdk源码,构建一 ...
- Nginx学习之十四-GDB调试Nginx初试
本文的测试环境: Win7+虚拟机VMWareVMware-workstation-full-7.1.4-385536+Ubuntu12.04 Nginx-1.4.0 要想有效的研究Nginx源码,必 ...
- linux下使用gdb对php源码调试
title: linux下使用gdb对php源码调试 date: 2018-02-11 17:59:08 tags: --- linux下使用gdb进行php调试 调试了一些php的漏洞,记录一下大概 ...
- Android动态方式破解apk进阶篇(IDA调试so源码)
一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...
- netbeans工具使用xdebug断点调试php源码
对有有经验的程序员,使用echo.print_r().print_f().var_dump()等函数足以调试php代码,如果需要在IDE工具中使用断点调试,xdebug就是一个非常好的php调试工具. ...
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...
- erlang下lists模块sort(排序)方法源码解析(一)
排序算法一直是各种语言最简单也是最复杂的算法,例如十大经典排序算法(动图演示)里面讲的那样 第一次看lists的sort方法的时候,蒙了,几百行的代码,我心想要这么复杂么(因为C语言的冒泡排序我记得不 ...
随机推荐
- Java--常用类summary
/* 2:API的概述(了解) (1)应用程序编程接口. (2)就是JDK提供给我们的一些提高编程效率的java类. 3:Object类(掌握) (1)Object是类层次结构的根类,所有的类都直接或 ...
- git的一个merge流程
git merge testSupport 合并testSupport分支代码到当前分支. 若无冲突发生,git commit -m "RM ID:5094",在git push即 ...
- BZOJ1962 模型王子
戳这里 /************************************************************** Problem: 1962 User: rausen Langu ...
- PDF 补丁丁 0.4.1 版将增加嵌入中文字库的功能
有不少用户反映,部分老 PDF 文件由于在制作时没有嵌入字库,导致该文件在某些阅读器上显示为乱码.即使他们用 Acrobat 嵌入了相应的字库,文件仍然无法正确显示. 这些老 PDF 看起来具有如下相 ...
- linux系统设置静态IP 查看网卡配置文件
http://jingyan.baidu.com/article/455a99508be7cda167277865.html vi /etc/sysconfig/network-scripts/ifc ...
- 管理工具MongoVUE使用
连接数据库 管理数据库 查询 1,查询所有 2,查询命令窗口
- 使用C#下载网络文件
下载 /// <summary> /// 下载文件 /// </summary> /// <param name="URL">下载文件地址< ...
- JavaOne 2016——观众得以一睹JShell的威力
导读 在JavaOne 2016的主题演讲中,Java平台组的首席架构师Mark Reinhold指出Java 9并不仅仅是Jigsaw,针对Java 9,一共包含了85个JEP.我在这里会关注一个他 ...
- js控制html元素的readonly属性
html元素假设为只读,那么其readonly="readonly",我们现在想通过js来改变readonly属性为可以输入. 初始时,两个输入框都是只读.点击change按钮后, ...
- 胡扯两句——CDQ分治
之前听大神讲过CDQ分治大概是个什么东西,但是一直还没有真正去搞过.今天稍微看了一下,写点自己的理解. 首先CDQ分治有两个条件. 条件1:可以分成两个独立互不影响的问题(这里的"独立&qu ...