1. GDB入门
说实话,我刚开始做嵌入式开发那会儿,调试基本靠printf。那时候觉得加打印就够用了,直到有一次,一个内存越界的bug让我加了整整三天打印,最后发现是野指针的问题。嗯,从那以后,我老老实实学起了GDB。
GDB是什么?说白了,就是一个让你能「看」到程序内部运行的调试器。它能让你暂停程序、查看变量、单步执行、甚至修改内存。你想想看,这比printf强了多少倍?
GDB的历史:一个老牌工具的故事
GDB全称是GNU Debugger,由Richard Stallman在1986年发起。没错,就是那个自由软件基金会的创始人。我记得我第一次接触GDB时,它已经快30岁了,但依然活跃在嵌入式开发的第一线。
为什么它能活这么久?因为GDB支持几乎所有的处理器架构——ARM、x86、RISC-V、MIPS,你叫得上名字的它基本都支持。我曾在一次项目中同时调试ARM Cortex-M4和RISC-V芯片,GDB一把梭,省了我不少事。
安装与启动:三分钟上手
安装GDB其实很简单。在Ubuntu上,一行命令搞定:
sudo apt-get install gdb
在macOS上,如果你装了Homebrew:
brew install gdb
Windows用户可以用MinGW或者WSL。我个人习惯用WSL,毕竟和Linux环境一致,省得切换时手忙脚乱。
启动GDB有两种方式:
- 直接启动:
gdb ./my_program - 先启动后加载:
gdb然后file ./my_program
我一般用第一种,一步到位。启动后你会看到GDB的交互界面,等着你输入命令。
基本工作流程:调试的四个步骤
GDB的工作流程其实就四步,我总结成「跑、停、看、改」:
- 跑:用
run命令启动程序 - 停:用
break设置断点,让程序停在指定位置 - 看:用
print查看变量值,用backtrace看调用栈 - 改:用
set修改变量,用continue继续执行
举个例子,假设你有一个简单的C程序:
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int c = a + b;
printf("c = %d\n", c);
return 0;
}
编译时记得加-g选项:
gcc -g -o test test.c
然后启动GDB:
gdb ./test
在GDB里输入:
(gdb) break main
(gdb) run
(gdb) print a
$1 = 10
(gdb) print b
$2 = 20
(gdb) set a = 100
(gdb) continue
你看,程序停在了main函数入口,我们查看了a和b的值,还把a改成了100。这就是GDB的基本操作。
核心要点:GDB的核心能力就是「控制程序执行」和「观察程序状态」。你不需要记住所有命令,先掌握break、run、print、continue这四个就够了。
GDB的知识体系
下面这张图是我自己画的,帮你理清GDB入门阶段的核心逻辑:
我的小技巧:刚开始用GDB时,别急着学高级命令。先把break、run、print、next、continue这五个命令练熟。我当年就是靠这五个命令,搞定了第一个嵌入式项目的调试。
注意:编译时一定要加-g选项!不加的话,GDB就看不到源码和变量名了。我曾经有一次忘了加,结果调试时看到的全是地址,那叫一个痛苦。
好了,这就是GDB入门的内容。说白了,GDB就是一个让你能「透视」程序运行的工具。你不需要一开始就记住所有命令,先动手试试,遇到问题再查。调试这东西,实践出真知。
可可精品资料库