您所在位置: 网站首页 / 文档列表 / linux/Unix相关 / 文档详情
142045_应用-Valgrind-发现-Linux-程序的内存问题.doc 立即下载
2024-01-18
约2.7万字
约28页
0
293KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

142045_应用-Valgrind-发现-Linux-程序的内存问题.doc

142045_应用-Valgrind-发现-Linux-程序的内存问题.doc

预览

免费试读已结束,剩余 18 页请下载文档后查看

12 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

简介调试程序有很多方法,例如向屏幕上打印消息,使用调试器,或者只需仔细考虑程序如何运行,并对问题进行有根有据的猜测。在修复bug之前,首先要确定在源程序中的位置。例如,当一个程序产生崩溃或生成核心转储(coredump)时,您就需要了解是哪行代码发生了崩溃。在找到有问题的代码行之后,就可以确定这个函数中变量的值,函数是如何调用的,更具体点说,为什么会发生这种错误。使用调试器查找这些信息非常简单。本文将简要介绍几种用于修复一些很难通过可视化地检查代码而发现的bug的技术,并阐述了如何使用在LinuxonPower架构上可用的工具。回页首调试内存问题的工具和技术动态内存分配看起来似乎非常简单:您可以根据需要分配内存——使用malloc()或其变种——并在不需要时释放这些内存。实际上,内存管理的问题是软件中最为常见的bug,因为通常在程序启动时这些问题并不明显。例如,程序中的内存泄漏可能开始并不为人注意,直到经过多天甚至几个月的运行才会被发现。接下来的几节将简要介绍如何使用流行的调试器Valgrind来发现并调试这些最常见的内存bug。在开始使用任何调试工具之前,请考虑这个工具是否对重新编译应用程序有益,是否可以支持具有调试信息的库(-g选项)。如果没有启用调试信息,调试工具可以做的最好的事情也不过是猜测一段特定的代码是属于哪个函数的。这使得错误消息和概要分析输出几乎没有什么用处。使用-g选项,您就有可能获得一些信息来直接指出相关的代码行。ValgrindValgrind已经在Linux应用程序开发社区中广泛用来调试应用程序。它尤其擅长发现内存管理的问题。它可以检查程序运行时的内存泄漏问题。这个工具目前正由JulianSeward进行开发,并由PaulMackerras移植到了Power架构上。要安装Valgrind,请从Valgrind的Web站点上下载源代码(参阅参考资料)。切换到Valgrind目录,并执行下面的命令:#make#makecheck#makeinstallValgrind的错误报告Valgrind的输出格式如下:清单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/du)==29404==是进程的ID。消息Address0x1189AD84is0bytesafterablockofsize12alloc'd说明在这个12字节的数组后面没有存储空间了。第二行以及后续几行说明内存是在130行(vg_replace_malloc.c)的strdup()程序中进行分配的。strdup()是在libc.so.6库的setlocale()中调用的;main()调用了setlocale()。未初始化的内存最为常见的一个bug是程序使用了未初始化的内存。未初始化的数据可能来源于:未经初始化的变量malloc函数所分配的数据,在写入值之前使用了下面这个例子使用了一个未初始化的数组:清单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==Conditionaljumpormovedependsonuninitialisedvalue(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==Forcountso
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

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

文档大小:293KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用

手机号注册 用户名注册
我已阅读并接受《用户协议》《隐私政策》
已有账号?立即登录
我已阅读并接受《用户协议》《隐私政策》
已有账号?立即登录
登录
手机号登录 微信扫码登录
微信扫一扫登录 账号密码登录

首次登录需关注“豆柴文库”公众号

新用户注册
VIP会员(1亿+VIP文档免费下)
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用