您的位置:首页 > 运维架构 > Linux

应用 Valgrind 发现 Linux 程序的内存问题

2010-01-02 21:04 441 查看
杨 经 (cdlyangj@cn.ibm.com), 软件工程师, IBM

如何定位应用程序开发中的内存问题,一直是 Linux 应用程序开发中的瓶颈所在。有一款非常优秀的 Linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题。掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题。

1 Valgrind 概述

1.1 体系结构

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示:



1 Valgrind 体系结构
Valgrind包括如下一些工具:
(1) Memcheck这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。
(2) Callgrind。它主要用来检查程序中函数调用过程中出现的问题。
(3) Cachegrind。它主要用来检查程序中缓存使用出现的问题。
(4) Helgrind。它主要用来检查多线程程序中出现的竞争问题。
(5) Massif。它主要用来检查程序中堆栈使用中出现的问题。
(6) Extension可以利用core提供的功能,自己编写特定的内存调试工具。

1.2 Linux 程序内存空间布局

要发现Linux下的内存问题,首先一定要知道在Linux下,内存是如何被分配的?下图展示了一个典型的Linux C程序内存空间布局:



2典型内存空间布局
一个典型的Linux C程序内存空间由如下几部分组成:

代码段(.text)。这里存放的是CPU要执行的指令。代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段是只读的,防止程序由于错误而修改自身的指令。

[b]初�%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: