数据结构-内存调试工具

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
相关推荐
伟大的车尔尼6 小时前
贪心的概念
数据结构·算法·贪心
AI情绪识别开源6 小时前
检信AI高一分班分科智选评估系统 v2.0测试报告
开发语言·数据结构·人工智能·科技
CoderYanger7 小时前
A.每日一题:输入单词需要的最少按键次数 Ⅰ+Ⅱ
java·数据结构·算法·leetcode·面试
雪碧聊技术8 小时前
KMP算法详解
数据结构
positive_zpc11 小时前
进阶数据结构图——关键路径(四)
数据结构·图论·关键路径
孙克旭_11 小时前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
Chester_199912 小时前
CSP202206C.角色授权
开发语言·数据结构·c++·蓝桥杯
旖旎夜光12 小时前
LeetCode 238:除自身以外数组的乘积(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
一条大祥脚13 小时前
26杭电暑期第八场(后半)快读|快写|tarjan|路径DP|mex转化|扫描线|前缀和|二分图
数据结构·算法·tarjan·杭电多校·强联通分量·动态规划dp
Chester_199921 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯