电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

Valgrind发现Linux程序的内存问题VIP专享VIP免费

Valgrind发现Linux程序的内存问题_第1页
Valgrind发现Linux程序的内存问题_第2页
Valgrind发现Linux程序的内存问题_第3页
应用 Valgrind 发现 Linux 程序的内存问题 Valgrind 概述 体系结构 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提供的功能,自己编写特定的内存调试工具。 Linux 程序内存空间布局 要发现Linux下的内存问题,首先一定要知道在Linux下,内存是如何被分配的?下图展示了一个典型的Linux C程序内存空间布局: 图 2: 典型内存空间布局 一个典型的Linux C程序内存空间由如下几部分组成:  代码段(.text)。这里存放的是CPU要执行的指令。代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段是只读的,防止程序由于错误而修改自身的指令。  初始化数据段(.data)。这里存放的是程序中需要明确赋初始值的变量,例如位于所有函数之外的全局变量:int val=100。需要强调的是,以上两段都是位于程序的可执行文件中,内核在调用 exec函数启动该程序时从源程序文件中读入。  未初始化数据段(.bss)。位于这一段中的数据,内核在执行该程序前,将其初始化为 0或者 null。例如出现在任何函数之外的全局变量:int sum;  堆(Heap)。这个段用于在程序中进行动态内存申请,例如经常用到的malloc,new系列函数就是从这个段中申请内存。  栈(Stack)。函数中的局部变量以及在函数调用过程中产生的临时变量都保存在此段中。 内存检查原理 Memcheck检测内存问题的原理如下图所示: 图 3 内存检查原理 Memcheck 能够检测出内存问题,关键在于其建立...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部