0

我想用gdb调试nginx程序,但是过程中出现了问题,能不能帮忙看看?

操作流程

1.首先配置了make的-g参数,使cc -g
2.gdb objs/nginx 开始调试
3.b src/core/nginx.c:91 打断点到函数的第一行,肯定有argc的

问题

1.有时候断点失效,捉摸不透,感觉自己用了假的gdb,比如输入r命令,直接执行完成了,并没有中断,使用print var,说

(gdb) print argc
No symbol "argc" in current context.

2.list参数显示文件源码,但是显示的是这个:

(gdb) list
1    /* Startup code compliant to the ELF x86-64 ABI.
2       Copyright (C) 2001-2012 Free Software Foundation, Inc.
3       This file is part of the GNU C Library.
4       Contributed by Andreas Jaeger <aj@suse.de>, 2001.
5
6       The GNU C Library is free software; you can redistribute it and/or
7       modify it under the terms of the GNU Lesser General Public
8       License as published by the Free Software Foundation; either
9       version 2.1 of the License, or (at your option) any later version.
10
(gdb) list main
No line number known for main.

按照网上配置了directory,还是不能解决,我是使用

(gdb) directory src/core/
alan 130
2018-07-13 提问
1 个回答
1

编译开发版的 nginx,这里以 github 上的 nginx 源码镜像为例

git clone https://github.com/nginx/nginx.git
cd nginx
CFLAGS="-g -O0" ./auto/configure --with-debug --prefix=../etc
make
make install

修改 nginx.conf 配置文件,让它监听在 8080 端口,并启用开发模式

worker_processes  1;
+master_process off;
+daemon off;

http {
   server {
       -listen       80;
       +listen       8080;

此时运行 nginx ,然后用浏览器打开 http://localhost:8080/ 确认网站运行

../etc/sbin/nginx

最后使用 gdb 重新运行 nginx

xxx/nginx > gdb ../etc/sbin/nginx
Reading symbols from ../etc/sbin/nginx...done.

(gdb) b main
Breakpoint 1 at 0xNNNN: file src/core/nginx.c, line 196.

(gdb) r
Starting program: ../etc/sbin/nginx
[Thread debugging using libthread_db enabled]
Using host libthread_db library "xxx/lib/libthread_db.so.1".

(gdb) b main
Breakpoint 1, main (argc=1, argv=0xNNNN) at src/core/nginx.c:196

(gdb) list main
191    static char **ngx_os_environ;
192
193
194    int ngx_cdecl
195    main(int argc, char *const *argv)
196    {
197        ngx_buf_t        *b;
198        ngx_log_t        *log;
199        ngx_uint_t        i;
200        ngx_cycle_t      *cycle, init_cycle;

(gdb) print argc
$1 = 1

(gdb) print argv[0]
$2 = 0xNNNN "xxx/etc/sbin/nginx"

gdb 提示

  1. 使用 help 或者 help xxx 获得命令帮助。
  2. 添加函数断点可直接输入 b <函数名>,不必找出函数的文件位置。list 同理。

参考

  1. https://docs.nginx.com/nginx/...
  2. https://nginx.org/en/docs/ngx...

撰写答案

推广链接