学习: gdb自动捕获调用栈

下面按整体效果 → 参数逐项说明 → 常见用途与注意点给你梳理一遍。


一、这条命令的整体效果

复制代码
gdb -q -batch -ex run -ex bt ./test

效果一句话总结:

用 GDB 以静默、非交互方式 自动运行程序 ./test,如果程序崩溃(如段错误) ,则自动打印完整调用栈回溯(backtrace),然后退出。


二、参数逐项说明

1️⃣ gdb

  • GNU Debugger 的主程序
  • 用于调试 C / C++ / 汇编等程序

2️⃣ -q(或 --quiet)

  • 作用 :
    启动 GDB 时不显示版本信息、版权说明等欢迎信息

  • 效果 :
    输出更干净,适合脚本或自动化环境

    等价于:
    (gdb) set confirm off
    (gdb) set verbose off


3️⃣ -batch

  • 作用 :
    让 GDB 以批处理模式运行
  • 特点 :
    • 不进入交互式界面
    • 执行完 -ex 指定的命令后自动退出
    • 非常适合:
      • CI / CD
      • 自动化测试
      • 脚本调试

✅ 常用于"跑完就走"的场景


4️⃣ -ex run

  • -ex:执行一条 GDB 命令
  • run:启动被调试程序

等价于在 GDB 中执行:

复制代码
(gdb) run

⚠️ 注意:

  • 如果程序正常运行结束,bt 仍然会执行,但可能没有有效栈信息
  • 如果程序 崩溃 / 异常退出 ,bt 会非常有用

5️⃣ -ex bt

  • bt = backtrace
  • 作用 :
    打印当前线程的函数调用栈

等价于:

复制代码
(gdb) bt

输出示例:

复制代码
#0  0x0000000000401145 in foo () at test.c:10
#1  0x0000000000401178 in main () at test.c:20

👉 用于快速定位:

  • 段错误(SIGSEGV)
  • 空指针访问
  • 栈溢出
  • 非法内存访问

6️⃣ ./test

  • 被调试的可执行程序
  • 必须:
    • 已编译
    • 最好带调试信息(-g)

✅ 推荐编译方式:

复制代码
gcc -g -O0 test.c -o test

三、实际执行流程(逻辑顺序)

  1. 启动 GDB
  2. 加载 ./test
  3. 执行 run
  4. 程序运行(或崩溃)
  5. 执行 bt
  6. GDB 自动退出

四、典型使用场景

✅ 1. 自动化捕获崩溃栈

复制代码
gdb -q -batch -ex run -ex bt ./test

适合:

  • 测试环境
  • 回归测试
  • 容器 / CI 环境

✅ 2. 搭配脚本批量分析

复制代码
for bin in ./tests/*; do
    gdb -q -batch -ex run -ex bt "$bin"
done

✅ 3. 程序崩溃时保存日志

复制代码
gdb -q -batch -ex run -ex bt ./test > crash.log 2>&1

五、常见注意事项(很重要)

⚠️ 1. 程序必须带调试信息

否则 bt 只能看到地址:

复制代码
#0  0x00007f8c2b3a4f25 in ?? ()

✅ 解决:

复制代码
gcc -g -O0 test.c -o test

⚠️ 2. 程序正常运行时 bt 意义不大

  • bt 只有在程序异常中断时才有价值
  • 正常运行结束不会生成有用栈信息

⚠️ 3. 程序卡死(死循环)不会触发 bt

  • run 不会中断

  • 需要额外处理(如 timeout)

    timeout 5 gdb -q -batch -ex run -ex bt ./test


六、进阶:更完整的崩溃分析命令(推荐)

复制代码
gdb -q -batch \
  -ex "run" \
  -ex "bt" \
  -ex "bt full" \
  -ex "info locals" \
  -ex "info args" \
  ./test

七、一句话记忆版 ✅

**gdb -q -batch -ex run -ex bt ./test**​

👉 用 GDB 静默、自动运行程序,崩溃时打印调用栈,常用于自动化调试。

相关推荐
Rabitebla17 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
无心水1 天前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd1 天前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
La Pulga1 天前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd1 天前
秋招学习笔记 day106
笔记·学习
小李不想当小白1 天前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
lisw051 天前
作为人类代理的大语言模型及其角色分类!
人工智能·学习·语言模型
Z21-X1 天前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生
坤坤子吖1 天前
Linux网络编程:UDP进阶,从字典服务器到简单聊天室
linux·服务器·网络·c++·笔记·学习
Rabitebla1 天前
【Linux学习笔记】进程篇(九):进程的创建与退出——fork、写时拷贝与退出码
linux·c++·笔记·学习