欢迎来到天天文库
浏览记录
ID:30364086
大小:89.62 KB
页数:12页
时间:2018-12-29
《zz程序错误检测工具》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、zz程序错误检测工具zz程序错误检测工具2010-06-2116:53来源:SteveBest(sbest@us.ibm.com)JFS核心小组成员,IBM2002年8月您可以用各种方法来监控运行着的用户空间程序:可以为其运行调试器并单步调试该程序,添加打印语句,或者添加工具来分析程序。本文描述了几种可以用来调试在Linux上运行的程序的方法。我们将回顾四种调试问题的情况,这些问题包括段错误,内存溢出和泄漏,还有挂起。本文讨论了四种调试Linux程序的情况。在第1种情况中,我们使用了两个有内存分配
2、问题的样本程序,使用MEMWATCH和YetAnotherMallocDebugger(YAMD)工具来调试它们。在第2种情况中,我们使用了Linux中的strace实用程序,它能够跟踪系统调用和信号,从而找出程序发生错误的地方。在第3种情况中,我们使用Linux内核的Oops功能来解决程序的段错误,并向您展示如何设置内核源代码级调试器(kernelsourceleveldebugger,kgdb),以使用GNU调试器(GNUdebugger,gdb)来解决相同的问题;kgdb程序是使用串行连接的
3、Linux内核远程gdb。在第4种情况中,我们使用Linux上提供的魔术键控顺序(magickeysequence)来显示引发挂起问题的组件的信息。常见调试方法当您的程序中包含错误时,很可能在代码中某处有一个条件,您认为它为真(true),但实际上是假(false)。找出错误的过程也就是在找出错误后推翻以前一直确信为真的某个条件过程。以下几个示例是您可能确信成立的条件的一些类型:在源代码中的某处,某变量有特定的值。在给定的地方,某个结构已被正确设置。对于给定的if-then-else语句,if部分
4、就是被执行的路径。当子例程被调用时,该例程正确地接收到了它的参数。找出错误也就是要确定上述所有情况是否存在。如果您确信在子例程被调用时某变量应该有特定的值,那么就检查一下情况是否如此。如果您相信if结构会被执行,那么也检查一下情况是否如此。通常,您的假设都会是正确的,但最终您会找到与假设不符的情况。结果,您就会找出发生错误的地方。调试是您无法逃避的任务。进行调试有很多种方法,比如将消息打印到屏幕上、使用调试器,或只是考虑程序执行的情况并仔细地揣摩问题所在。在修正问题之前,您必须找出它的源头。举例来
5、说,对于段错误,您需要了解段错误发生在代码的哪一行。一旦您发现了代码中出错的行,请确定该方法中变量的值、方法被调用的方式以及关于错误如何发生的详细情况。使用调试器将使找出所有这些信息变得很简单。如果没有调试器可用,您还可以使用其它的工具。(请注意,产品环境中可能并不提供调试器,而且Linux内核没有内建的调试器。)实用的内存和内核工具您可以使用Linux上的调试工具,通过各种方式跟踪用户空间和内核问题。请使用下面的工具和技术来构建和调试您的源代码:用户空间工具:内存工具:MEMWATCH和YAMD
6、straceGNU调试器(gdb)魔术键控顺序内核工具:内核源代码级调试器(kgdb)内建内核调试器(kdb)Oops本文将讨论一类通过人工检查代码不容易找到的问题,而且此类问题只在很少见的情况下存在。内存错误通常在多种情况同时存在时出现,而且您有时只能在部署程序之后才能发现内存错误。第1种情况:内存调试工具C语言作为Linux系统上标准的编程语言给予了我们对动态内存分配很大的控制权。然而,这种自由可能会导致严重的内存管理问题,而这些问题可能导致程序崩溃或随时间的推移导致性能降级。内存泄漏(即ma
7、lloc()内存在对应的free()调用执行后永不被释放)和缓冲区溢出(例如对以前分配到某数组的内存进行写操作)是一些常见的问题,它们可能很难检测到。这一部分将讨论几个调试工具,它们极大地简化了检测和找出内存问题的过程。MEMWATCHMEMWATCH由JohanLindh编写,是一个开放源代码C语言内存错误检测工具,您可以自己下载它(请参阅本文后面部分的参考资料)。只要在代码中添加一个头文件并在gcc语句中定义了MEMWATCH之后,您就可以跟踪程序中的内存泄漏和错误了。MEMWATCH支持AN
8、SIC,它提供结果日志纪录,能检测双重释放(double-free)、错误释放(erroneousfree)、没有释放的内存(unfreedmemory)、溢出和下溢等等。清单1.内存样本(test1.c)#include"STDLIB.H"#include"STDIO.H"#include"memwatch.h"intmain(void){char*ptr1;char*ptr2;ptr1=malloc(512);ptr2=malloc(512);ptr2=ptr1;free(pt
此文档下载收益归作者所有