gdb调试nginx的helloworld

本文介绍了如何使用gdb调试Nginx进程的方法,包括设置断点、观察点等技巧,并提供了具体的命令示例,帮助读者更好地理解Nginx的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设nginx装在了/usr/local/nginx/
./nginx -c conf/nginx.conf
在任意目录
gdb -d /usr/local/nginx/objs/ nginx 10776
或者gdb -d /usr/local/nginx/objs/ nginx
进入后再attach 10777
(gdb) info program 
Using the running image of attached Thread 0x2af36f21d520 (LWP 10776).
Program stopped at 0x6e23079a.
(gdb) show env
(gdb) show paths
(gdb)info terminal
(gdb)pwd

在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观
察点(Watch Point)、捕捉点(Catch Point)、信号(Signals)、
线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是
continue命令
---------------
ps -ef|grep nginx
gcore 5518
生成core文件
[code="java"]# pstack 5518
#0 0x0000003b6e23079a in sigsuspend () from /lib64/libc.so.6
#1 0x000000000042d5bd in ngx_master_process_cycle ()
#2 0x00000000004031c7 in main ()
# [/code]
gdb /usr/local/nginx/objs/nginx ./core.5518
(gdb) search ngx_master_process_cycle
(gdb) b ngx_master_process_cycle
(gdb)bt
(gdb)frame
参考http://www.yuanma.org/data/2009/0407/article_3605.htm

(gdb)help all
-----------------
commands
(gdb) b 19
Breakpoint 2 at 0x4004e9: file tst.c, line 19.
(gdb) commands
Type commands for when breakpoint 2 is hit, one per line.
End with a line saying just "end".
>printf "haha"
>end
(gdb) r
Starting program: /root/gdbtest/0919/tst

Breakpoint 2, main () at tst.c:19
19 result += i;
haha(gdb)
(gdb)


info args
打印出当前函数的参数名及其值。

info locals
打印出当前函数中所有局部变量及其值。

info catch
打印出当前的函数中的异常处理信息。

forward-search <regexp>
search <regexp>
向前面搜索。

reverse-search <regexp>
### 使用 GDB 调试 C/C++ "Hello World" 程序 为了使用 GDB 调试简单的 "Hello World" 程序,在配置好开发环境之后,创建并编译带有调试信息的源文件非常重要。通常情况下,这可以通过向 `g++` 或者 `gcc` 编译命令添加 `-g` 参数来实现[^1]。 #### 创建和编译带调试信息的 Hello World 程序 编写一个名为 `hello.cpp` 的简单 C++ 文件: ```cpp #include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; } ``` 接着通过如下方式编译该程序,并确保加入 `-g` 标志以便生成必要的调试符号表: ```bash g++ -g hello.cpp -o hello ``` #### 配置 VS Code 和 GDB 进行调试 在 Visual Studio Code 中设置启动 JSON 文件 (`launch.json`) 来指定当按下 F5 键时应执行的操作。从主菜单中选择 **Run > Add Configuration...**, 接着选取适合的选择项如 **C++ (GDB/LLDB)** 并进一步挑选预定义好的构建与调试选项之一——例如 “g++.exe build and debug active file”。此过程会自动生成所需的配置文件。 #### 启动调试器并运行程序 一旦完成上述步骤,则可以在编辑器内打开刚才编写的 `hello.cpp`, 设置断点(点击左侧边栏对应行号旁的小圆圈),最后按 F5 开始调试会话。此时应该能看到控制台输出以及变量监视窗口等辅助工具帮助理解代码行为。 对于更复杂的信号处理场景下的异常恢复机制可以参见下面的例子函数 `segfault()` ,它展示了如何利用标准库中的 `<signal.h>` 函数捕获特定类型的错误事件并采取相应措施[^2]: ```c static void segfault(int signo){ if(canjump == 0){ return; /* unexpected signal, ignore */ } canjump = 0; siglongjmp(jmpbuf, signo); /* jump back to main, don't return */ } /* end of segfault */ ``` 不过请注意,这段代码片段并不适用于常规的应用逻辑;而是用于展示某些特殊条件下可能涉及到的技术细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值