学习: 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 静默、自动运行程序,崩溃时打印调用栈,常用于自动化调试。

相关推荐
Song_RsHt1 小时前
Gateway (上):路由与转发,微服务的统一入口
java·笔记·后端·学习·gateway
2603_969579281 小时前
备份云盘是什么意思?简单说就是“用云盘来备份数据”
学习
David猪大卫3 小时前
【C++修炼】string类:string类的模拟实现
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
lisw054 小时前
“科学前沿极限突破计划”述评!
大数据·人工智能·学习
外收内放4 小时前
数据分析(数据清洗)
python·学习·数据分析
一条泥憨鱼4 小时前
【计算机网络】| 详解链路层:MAC 地址与VLAN
网络·学习·计算机网络
燕落南枝5 小时前
C 语言学习大总结:从入门到进阶的完整知识体系
服务器·c语言·学习
科技林总5 小时前
从零开始学习DeerFlow完整路径
学习