GDB(GNU Debugger)GNU 调试器 ,是 Linux 下 C/C++ 语言最常用的命令行调试工具。
gcc 负责把 C 代码编译成可执行程序;gdb 用来调试这个程序。
它能干什么
- 让程序停在指定位置(设置断点),一行一行执行代码;
- 随时看变量、指针、结构体、数组里面的值;
- 程序崩溃(段错误 segment fault)时,定位在哪一行代码崩掉;
- 可以临时修改内存里变量的值,测试不同情况;
- 查看函数调用栈,看函数是谁调用的。
基本操作
基本操作:
1.list -- 查看当前的代码
2.b 行号 --下断点
3.r -- run --从头开始运行点,到断点处会停
4.p 变量名 -- 查看当前的变量
5.n -- next ---单步调试
6.quit -- 退出
reak function_name # 在函数入口设断点
break file.c:42 # 在特定行设断点
run [args] # 启动程序
next / step # 单步跳过 / 进入函数
continue # 继续执行
backtrace / bt # 查看调用栈
frame N # 切换到栈帧 N
info locals # 显示当前栈帧的局部变量
print / p expr # 打印表达式值
list # 显示当前位置源码
直接查看内存内容
`x` (examine) 是 GDB 查看内存的利刃。
格式:`x /[个数][格式][大小] 地址`
- 格式:`x`(十六进制), `d`(十进制), `s`(字符串), `i`(指令)
- 大小:`b`(字节), `h`(半字2字节), `w`(字4字节), `g`(8字节)

x为命令符号,/区分操作符号和命令符号,40代表打印40个单元参数,单元格式为b,一个字节大小,第二个x代表打印的单元数据以十六进制呈现,从a0这个地址开始访问40个单元的数据,
Valgrind 是一套动态二进制插桩工具集合,最常用的是:
-
Memcheck:查内存错误(越界、UAF、重复 free、未初始化读、泄漏)
-
Callgrind:性能分析(函数调用/指令计数,配合 kcachegrind)
-
Helgrind /DRD:多线程数据竞争/锁问题
入门阶段建议只抓住:Memcheck + 正确编译参数 + 读懂报告 + 修复循环。
基础指令:在指令后添加对应需要编译的文件
gcc -g -O0 -fno-omit-frame-pointer -Wall -Wextra main.c foo.c
-g //添加调试信息
-O0 //优化级别 不优化
-Wall -Wextra:先用编译器把明显问题扫一遍(能省大量时间)
-fno-omit-frame-pointer(让栈回溯更稳定 --帧)
基础使用:
valgrind ./a.out
valgrind 可执行文件

最常用指令:
valgrind --leak-check=full ./app arg1 arg2
参数解释:
--leak-check=full:泄漏细节更全
--show-leak-kinds=all:显示 definitely/indirectly/possibly/ still reachable
--track-origins=yes:追踪未初始化值来源(慢一些,但非常值)
eg:
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./a.out