使用Valgrind检测内存问题(C语言)

在C语言编程里,最常见的内存问题就是使用了malloc分配的内存,忘记释放(free)造成的内存泄漏。今天介绍一个内存检测工具Valgrind。

在Linux系统上,如Unbuntu安装Valgrind:

apt-get install valgrind

我先写一个内存泄漏的代码,然后演示如何使用valgrind来找到泄漏点。

编译带调试信息的可执行文件

c 复制代码
# gcc -g tt.c -o tt

-g 告诉 GCC 在编译 / 链接过程中,将调试信息(Debug Information) 嵌入到生成的目标文件(.o)或可执行文件中。这些调试信息包括:

  • 源代码行号与机器指令的映射关系;
  • 变量名、函数名、类型信息(不再被剥离);
  • 源代码文件路径、函数参数 / 局部变量的存储位置等。
  • 没有 -g 时,GCC 生成的可执行文件会默认剥离调试信息,仅保留运行所需的机器码,此时用 gdb 调试只能看到汇编指令,无法关联源代码,也无法查看 / 修改变量。

使用valgrind检测内存问题

c 复制代码
valgrind --tool=memcheck ./tt

memcheck 是默认工具,可省略 --tool=memcheck。

c 复制代码
valgrind ./tt

从上图,我们知道,程序一共申请了2块内存,释放了一次,在程序退出时,还有一块1字节内存没有释放。

memcheck 本质是一个 "内存检测模拟器",它会让程序在 Valgrind 的虚拟 CPU 中运行,全程监控每一次内存操作(分配 / 释放 / 访问),能检测出以下高频问题:

  • 内存泄漏 (Memory Leak) ,如malloc/new 分配后未 free/delete
  • 数组 / 指针越界访问 int a[5]; a[5] = 10;(访问超出数组范围)
  • 使用未初始化的内存 int x; printf("%d", x);
  • 重复释放内存 free§; free§;
  • 释放后仍访问内存 (野指针) free§; printf("%d", *p);
  • 内存分配 / 释放不匹配 new[] 分配却用 delete 释放
  • 栈内存溢出,局部数组过大 / 递归过深导致栈越界

使用--leak-check=full查找泄漏点

从上面的信息,可知tt.c的第8行出了问题。

相关推荐
为何创造硅基生物6 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好6 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李6 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅6 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆6 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
jolimark7 小时前
C语言自学攻略:小白入门三步走
c语言·编程入门·学习路线·实践项目·自学攻略
cen__y7 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人8 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生9 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588