使用 Valgrind 检查内存问题

2022-04-24
cpp ]

前天碰到一个 C++ 内存读写导致的问题,在释放一个对象时出现无效指针,但是这个问题导致原因却和该对象无关。尝试修复了一天,没有头绪,最后求助 valgrind,用了半小时把工具配置完成后几乎没费什么力气就找到了内存问题。嗯?工具非常重要,有时候真的事倍功半。

内存问题分类

一般内存问题包括两种:

  1. 无效的内存地址访问:也就是在程序运行过程中访问了不应该访问的内存区域。

引起这个问题的常见的原因是因为你使用了指针指向了未分配的或无效的内存地址,然后进行写入或读取操作。其中,写入的操作最致命,因为有可能弄乱当前的程序堆栈,在返回或跳转的时候跳到无效的代码处运行,得到意想不到的结果,也就是经常听到的 UB - (Unexpect behavior)。

  1. 内存泄漏:也就是在程序退出时,仍然有请求分配的内存未被程序释放。

虽然在进程退出时,该进程分配的内存都会被操作系统回收,但是,若这些应该被程序释放的内存在程序退出的那一刻都没有被释放,这意味着程序有可能在运行时候会申请越来越多的内存,直到操作系统无内存可用。也就是 OOM - (Out of memory)。

安装

安装 Valgrind 很简单,一般在 Debian/Ubuntu 操作系统下可以直接使用命令安装:sudo apt install valgrind -y

运行

安装完成后,直接运行valgrind [你的程序]即可开始运行并检查你的程序是否存在内存访问问题。或添加参数:--leak-check=yes来同时检查是否有内存泄漏问题。

在运行结束后,Valgrind 会给出一个检查报告,指出存在有内存问题的地方,同时会报告代码位置(你需要编译你的程序的时候带上 debug)信息。根据这些信息可以定位代码并了解上下文进而解决问题。

官网指南

访问这个网址可以到 Valgrind 的官方网站查看相关的信息:https://valgrind.org/docs/manual/quick-start.html