• 130

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

我想用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/
阅读 975
评论
    1 个回答
    • 4.6k

    编译开发版的 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...
      撰写回答

      登录后参与交流、获取后续更新提醒