Board logo

标题: 应用 Valgrind 发现 Linux 程序的内存问题 (1) [打印本页]

作者: look_w    时间: 2018-5-23 17:43     标题: 应用 Valgrind 发现 Linux 程序的内存问题 (1)

应用 Valgrind 发现 Linux 程序的内存问题Valgrind 概述体系结构Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示:
图 1 Valgrind 体系结构Valgrind包括如下一些工具:
Linux 程序内存空间布局要发现Linux下的内存问题,首先一定要知道在Linux下,内存是如何被分配的?下图展示了一个典型的Linux C程序内存空间布局:
图 2: 典型内存空间布局一个典型的Linux C程序内存空间由如下几部分组成:
内存检查原理Memcheck检测内存问题的原理如下图所示:
图 3 内存检查原理Memcheck 能够检测出内存问题,关键在于其建立了两个全局表。
对于进程的整个地址空间中的每一个字节(byte),都有与之对应的 8 个 bits;对于 CPU 的每个寄存器,也有一个与之对应的 bit 向量。这些 bits 负责记录该字节或者寄存器值是否具有有效的、已初始化的值。
对于进程整个地址空间中的每一个字节(byte),还有与之对应的 1 个 bit,负责记录该地址是否能够被读写。
检测原理:
Valgrind 使用第一步:准备好程序
为了使valgrind发现的错误更精确,如能够定位到源代码行,建议在编译时加上-g参数,编译优化选项请选择O0,虽然这会降低程序的执行效率。
这里用到的示例程序文件名为:sample.c(如下所示),选用的编译器为gcc。
生成可执行程序 gcc –g –O0 sample.c –o sample
清单 1第二步:在valgrind下,运行可执行程序。
利用valgrind调试内存问题,不需要重新编译源程序,它的输入就是二进制的可执行程序。调用Valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]
Valgrind 的参数分为两类,一类是 core 的参数,它对所有的工具都适用;另外一类就是具体某个工具如 memcheck 的参数。Valgrind 默认的工具就是 memcheck,也可以通过“--tool=tool name”指定其他的工具。Valgrind 提供了大量的参数满足你特定的调试需求,具体可参考其用户手册。
这个例子将使用 memcheck,于是可以输入命令入下:valgrind <Path>/sample.
第三步:分析 valgrind 的输出信息。
以下是运行上述命令后的输出。
清单 2示例程序显然有两个问题,一是fun函数中动态申请的堆内存没有释放;二是对堆内存的访问越界。这两个问题均被valgrind发现。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0