数据结构-内存调试工具

GDB(GNU Debugger)GNU 调试器 ,是 Linux 下 C/C++ 语言最常用的命令行调试工具

gcc 负责把 C 代码编译成可执行程序;gdb 用来调试这个程序

它能干什么

  1. 让程序停在指定位置(设置断点),一行一行执行代码;
  2. 随时看变量、指针、结构体、数组里面的值;
  3. 程序崩溃(段错误 segment fault)时,定位在哪一行代码崩掉;
  4. 可以临时修改内存里变量的值,测试不同情况;
  5. 查看函数调用栈,看函数是谁调用的。

基本操作

基本操作:

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
相关推荐
Mem0rin3 小时前
前缀和:中心下标与数组乘积
数据结构·算法
Lazionr3 小时前
list容器详解——双向链表的封装与使用
数据结构·c++·链表·list
漂流瓶jz3 小时前
UVA-12174 Shuffle的播放记录 题解答案代码 算法竞赛入门经典第二版
数据结构·c++·算法·图论·滑动窗口·算法竞赛入门经典·uva
lingran__3 小时前
C++ 高阶数据结构:红黑树万字详解|完整原理推导 + 插入实现 + 完整性校验【STL 底层】
数据结构·c++·面试·红黑树·二叉搜索树·平衡二叉树·stl底层
moonsims4 小时前
低空量子无人机
前端·数据结构
love_muming4 小时前
二叉树操作全解析:从递归到层序遍历
java·数据结构·算法·二叉树
白狐_79815 小时前
408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结
数据结构
Forever Nore18 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
旖旎夜光20 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针