鍍金池/ 問答/C  Linux  數(shù)據(jù)庫/ 我想用gdb調(diào)試nginx程序,但是使用gdb過程中出現(xiàn)了問題,能不能幫忙看看?

我想用gdb調(diào)試nginx程序,但是使用gdb過程中出現(xiàn)了問題,能不能幫忙看看?

我想用gdb調(diào)試nginx程序,但是過程中出現(xiàn)了問題,能不能幫忙看看?

操作流程

1.首先配置了make的-g參數(shù),使cc -g
2.gdb objs/nginx 開始調(diào)試
3.b src/core/nginx.c:91 打斷點到函數(shù)的第一行,肯定有argc的

問題

1.有時候斷點失效,捉摸不透,感覺自己用了假的gdb,比如輸入r命令,直接執(zhí)行完成了,并沒有中斷,使用print var,說

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

2.list參數(shù)顯示文件源碼,但是顯示的是這個:

(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.

按照網(wǎng)上配置了directory,還是不能解決,我是使用

(gdb) directory src/core/
回答
編輯回答
貓館

編譯開發(fā)版的 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 配置文件,讓它監(jiān)聽在 8080 端口,并啟用開發(fā)模式

worker_processes  1;
+master_process off;
+daemon off;

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

此時運行 nginx ,然后用瀏覽器打開 http://localhost:8080/ 確認網(wǎng)站運行

../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. 添加函數(shù)斷點可直接輸入 b <函數(shù)名>,不必找出函數(shù)的文件位置。list 同理。

參考

  1. https://docs.nginx.com/nginx/...
  2. https://nginx.org/en/docs/ngx...
2018年8月1日 13:33