使用GDB调试nginx

来源:互联网 发布:snh48黑历史 知乎 编辑:程序博客网 时间:2024/05/29 03:32

gdb是Linux上调试应用程序的首选。在进行nginx的调试过程中,首先需要修改Makefile文件。

当然,也可以添加 -gstabs 代替 -O0 ,二者是等同的。上面这种方法是在 ./configure 之后的。如果想省事的话,可以执行如下操作,避免了后续对 Makefile 文件的修改。

调试nginx总体来说有三种方法。

一、设置nginx为前台单进程模式

修改配置文件,增加如下两句:

这就可以了,启动调试。

说明:在这个过程中,因为nginx是前台运行,占用了键盘,因此gdb的命令无法输入。需要输入Ctrl+C,暂停nginx,然后设置断点等一系列操作,之后键入 c 则 nginx就会继续运行了。如下所示:

二、设置nginx为后台单进程模式

修改配置文件为:

这样就打开了nginx后台运行的模式,启动gdb调试发现如下:

难道进程真的退出了吗?没有,退出的只是nginx的父进程,而fork出来的进程gdb没有跟到,所以出现了这个情况。这种情况下,gdb是有自己的策略的。命令如下:(其实这一点我还是比较困惑的!)

三、设置nginx为后台多进程模式

这也是nginx的默认运行模式。在这种情况下,使用gdb的attach和detach指令。

首先查看nginx的work_process进程号是多少,然后直接attach调试就可以了。

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Readingsymbolsfrom/usr/local/nginx/sbin/nginx...done.
(gdb) run
Startingprogram:/usr/local/nginx/sbin/nginx
[Thread debugging usinglibthread_dbenabled]
 
Program exited normally.
(gdb)shellpidofnginx
5776 5775
(gdb)attach5775
Attaching to program:/usr/local/nginx/sbin/nginx,process5775
Readingsymbolsfrom/lib/libpthread.so.0...(nodebuggingsymbolsfound)...done.
[Thread debugging usinglibthread_dbenabled]
Loadedsymbolsfor/lib/libpthread.so.0
 
#停止调试,使用detach即可