应用 valgrind 发现 linux 程序的内存问题

应用 valgrind 发现 linux 程序的内存问题

ID:10253833

大小:290.50 KB

页数:28页

时间:2018-06-13

应用 valgrind 发现 linux 程序的内存问题_第1页
应用 valgrind 发现 linux 程序的内存问题_第2页
应用 valgrind 发现 linux 程序的内存问题_第3页
应用 valgrind 发现 linux 程序的内存问题_第4页
应用 valgrind 发现 linux 程序的内存问题_第5页
资源描述:

《应用 valgrind 发现 linux 程序的内存问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、简介调试程序有很多方法,例如向屏幕上打印消息,使用调试器,或者只需仔细考虑程序如何运行,并对问题进行有根有据的猜测。在修复bug之前,首先要确定在源程序中的位置。例如,当一个程序产生崩溃或生成核心转储(coredump)时,您就需要了解是哪行代码发生了崩溃。在找到有问题的代码行之后,就可以确定这个函数中变量的值,函数是如何调用的,更具体点说,为什么会发生这种错误。使用调试器查找这些信息非常简单。本文将简要介绍几种用于修复一些很难通过可视化地检查代码而发现的bug的技术,并阐述了如何使用在LinuxonPower架构上可用的工具。回页首调试内存问题的工具和技术动态内存分配看起来

2、似乎非常简单:您可以根据需要分配内存——使用malloc()或其变种——并在不需要时释放这些内存。实际上,内存管理的问题是软件中最为常见的bug,因为通常在程序启动时这些问题并不明显。例如,程序中的内存泄漏可能开始并不为人注意,直到经过多天甚至几个月的运行才会被发现。接下来的几节将简要介绍如何使用流行的调试器Valgrind来发现并调试这些最常见的内存bug。在开始使用任何调试工具之前,请考虑这个工具是否对重新编译应用程序有益,是否可以支持具有调试信息的库(-g选项)。如果没有启用调试信息,调试工具可以做的最好的事情也不过是猜测一段特定的代码是属于哪个函数的。这使得错误消息和

3、概要分析输出几乎没有什么用处。使用-g选项,您就有可能获得一些信息来直接指出相关的代码行。ValgrindValgrind已经在Linux应用程序开发社区中广泛用来调试应用程序。它尤其擅长发现内存管理的问题。它可以检查程序运行时的内存泄漏问题。这个工具目前正由JulianSeward进行开发,并由PaulMackerras移植到了Power架构上。要安装Valgrind,请从Valgrind的Web站点上下载源代码(参阅参考资料)。切换到Valgrind目录,并执行下面的命令:#make#makecheck#makeinstallValgrind的错误报告Valgrind的输

4、出格式如下:清单1.Valgrind的输出消息#valgrinddu–x–s..==29404==Address0x1189AD84is0bytesafterablockofsize12alloc'd==29404==at0xFFB9964:malloc(vg_replace_malloc.c:130)==29404==by0xFEE1AD0:strdup(in/lib/tls/libc.so.6)==29404==by0xFE94D30:setlocale(in/lib/tls/libc.so.6)==29404==by0x10001414:main(in/usr/bin/

5、du)==29404==是进程的ID。消息Address0x1189AD84is0bytesafterablockofsize12alloc'd说明在这个12字节的数组后面没有存储空间了。第二行以及后续几行说明内存是在130行(vg_replace_malloc.c)的strdup()程序中进行分配的。strdup()是在libc.so.6库的setlocale()中调用的;main()调用了setlocale()。未初始化的内存最为常见的一个bug是程序使用了未初始化的内存。未初始化的数据可能来源于:·未经初始化的变量·malloc函数所分配的数据,在写入值之前使用了下面这

6、个例子使用了一个未初始化的数组:清单2.使用未初始化的内存2{3inti[5];45if(i[0]==0)6i[1]=1;7return0;8}在这个例子中,整数数组i[5]没有进行初始化;因此,i[0]包含的是一个随机数。因此使用i[0]的值来判断一个条件分支就会导致不可预期的问题。Valgrind可以很容易捕获这种错误条件。当您使用Valgrind运行这个程序时,就会接收到下面的消息:清单3.Valgrind的输出消息#gcc–g–otest1test1.c#valgrind./test1..==31363====31363==Conditionaljumpormoved

7、ependsonuninitialisedvalue(s)==31363==at0x1000041C:main(test1.c:5)==31363====31363==ERRORSUMMARY:1errorsfrom1contexts(suppressed:7from1)==31363==malloc/free:inuseatexit:0bytesin0blocks.==31363==malloc/free:0allocs,0frees,0bytesallocated.==31363==Forcount

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。