命令 作用 备注
──────────────────── ──────────────────────────── ──────────────────────────
run / r 启动/继续 带参数: run -- -e flag
break / b 函数名 下断点(函数入口) b main / b 123(行号)
break / b 文件:行 下断点(指定文件行) b nginx.c:456
break / b 条件 条件断点 b read fd==3
watch / rwatch 监视变量改变(写/读+写) watch count
info breakpoints / i b 查看所有断点
delete / d 编号 删除断点
continue / c 继续运行到下一断点
next / n 单步(不进入函数)
step / s 单步(进入函数)
finish 跑到当前函数返回
backtrace / bt 打印当前调用堆栈
frame N / f N 切到第N帧(看那个帧的局部变量)
print / p 表达式 打印变量/表达式
p *ptr 解引用指针
p (struct T*)0x1000 按类型解释内存
print /x addr 十六进��显示
list / l 显示当前源码(前后10行)
info locals 当前帧所有局部变量
info args 当前帧参数
info registers / i r 所有CPU寄存器
info threads 所有线程
thread N 切到线程N
info proc mappings 进程内存映射(=cat /proc/pid/maps)
x/Nc addr 反汇编查看(addr)
x/10i $pc 当前PC位置反汇编10条
x/4xw 0x7fff... 4个word(32bit)十六进制
disassemble / disas 反汇编当前函数
attach / a PID 附加到进程
detach / d 脱离进程(进程继续跑)
kill / k 杀掉被调试进程
quit / q 退出GDB
help cmd 查某命令帮助
5.实战场景
场景1:进程卡住/响应慢/抓堆栈
1 2 3 4 5 6 7 8 9 10 11
# 不杀进程, 只抓一次全线程堆栈后继续 gdb -p 12345 -batch -ex "thread apply all bt full" 2>&1 | tee /tmp/bt.txt
# 输出示例: # Thread 23 (Thread 0x7f3a...): # #0 0x00007f3a... in futex_wait_cancelable () # #1 0x00007f3a... in pthread_cond_wait () # #2 0x000055... in NIOSSL_thread_acquire () at ssl.c:1234 # ...
# 2. 程序崩溃后, 找到core文件 ls -la /tmp/core.* # 或 systemd系统: coredumpctl list coredumpctl info nginx 12345 # 自动找到core并显示
# 3. GDB分析 gdb ./nginx /tmp/core.nginx.12345 (gdb) bt full # 全堆栈+所有局部变量 (gdb) frame 5 # 切到第5帧 (gdb) p *ptr # 看崩溃时指针值 (gdb) p *req # 看请求结构体内容 (gdb) x/16xw $rsp# 看栈顶16个word(找参数)
典型崩溃堆栈解读:
#0 0x000055... in ngx_http_handler () at http.c:892
r = 0x7f3a...
r->method = 2
#1 0x000055... in ngx_http_do_run () at http.c:2001
#2 0x000055... in ngx_epoll_process_events () at events.c:845
#3 0x000055... in main () at main.c:380
→ 第892行: r->method = 2(GET) 但 r 本身可能是悬垂指针
→ p r 看地址是否在合法范围
→ info proc mappings 确认堆/栈/so段范围