(计算机应用技术专业论文)魔力平台中调试系统的研究与实现.pdf_第1页
(计算机应用技术专业论文)魔力平台中调试系统的研究与实现.pdf_第2页
(计算机应用技术专业论文)魔力平台中调试系统的研究与实现.pdf_第3页
(计算机应用技术专业论文)魔力平台中调试系统的研究与实现.pdf_第4页
(计算机应用技术专业论文)魔力平台中调试系统的研究与实现.pdf_第5页
已阅读5页,还剩69页未读 继续免费阅读

(计算机应用技术专业论文)魔力平台中调试系统的研究与实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

- - | , :更 一 j 一 哈尔滨工程大学 学位论文原创性声明 本人郑重声明:本论文的所有工作,是在导师的指导下,由 作者本人独立完成的。有关观点、方法、数据和文献的引用己在 文中指出,并与参考文献相对应。除文中已注明引用的内容外, 本论文不包含任何其他个人或集体已经公开发表的作品成果。对 本文的研究做出重要贡献的个人和集体,均已在文中以明确方式 标明。本人完全意识到本声明的法律结果由本人承担。 作者( 签字) :卓专月 日期:2 0 l o 年3 月,7 日 哈尔滨工程大学 学位论文授权使用声明 本人完全了解学校保护知识产权的有关规定,即研究生在校 攻读学位期间论文工作的知识产权属于哈尔滨工程大学。哈尔滨 工程大学有权保留并向国家有关部门或机构送交论文的复印件。 本人允许哈尔滨工程大学将论文的部分或全部内容编入有关数据 库进行检索,可采用影印、缩印或扫描等复制手段保存和汇编本 学位论文,可以公布论文的全部内容。同时本人保证毕业后结合 学位论文研究课题再撰写的论文一律注明作者第一署名单位为哈 尔滨工程大学。涉密学位论文待解密后适用本声明。 本论文( 口在授予学位后即可回在授予学位1 2 个月后 口解密后) 由哈尔滨工程大学送交有关部门进行保存、汇编等。 作者( 签字) :韩月导师( 签字) :旅又叛 日期:2 0 j o 够月,7 日2 0 l o 年3 月,7 日 一 一 哈尔滨t 程大学硕十学何论文 摘要 魔力平台是一整套致力于解决软件开发、软件生产效率与显著降低软件 开发成本、提高可靠性、解决高适应性的商业业务建模系统平台。本着提高 软件质量的宗旨,做了大量工作,比如提供高质量的构件。然而,现有的调 试功能主要面向后台开发人员,不能满足用户的调试需求。本课题基于“用 户调试平台生产出的软件”的需求,设计并实现了调试系统。 本课题首先研究调试的一般过程、调试方法和调试技术。接着对w e b s e r v i c e 技术进行了研究。介绍了几个核心概念,并给出了一个基于w e bs e r v i c e 的应用体系结构。 在设计部分,首先对错误分类进行了研究,从3 个角度对错误分类进行 了阐述,即按严重程度、按b u g 所属的软件开发阶段以及按操作模型的错误 分类。 其次确定了调试策略。说明了如何按层级捕获异常,以及如何在此基础 上按业务逻辑层层定位异常。 然后给出了魔力平台可视化调试系统的体系结构。接着讲述了2 个特点, 一是对同志和操作模型的结合,一是日志与跟踪技术的结合。之后对编译系 统功能进行了简要说明。 在实现部分,对魔力平台调试系统的各个模块进行详细说明。 最后对本课题的工作进行了总结。 关键词:调试;b u g ;同志;跟踪;w e bs e r v i c e 哈尔滨t 程大学硕十学何论文 a b s t r a c t m a g i cp l a t f o r mi sab u s i n e s sm o d e l i n gp l a t f o r mw h i c ht r i e st os o l v et h e p r o b l e mo fs o f t w a r ed e v e l o p m e n t ,i m p r o v es o f t w a r ep r o d u c t i v i t y ,r e d u c et h ec o s t o fs o f t w a r ed e v e l o p m e n t ,i m p r o v et h er e l i a n c e ,a n da d a p t a b i l i t yo fs o f t w a r e w i t h the p u r p o s eo fi m p r o v i n gt h eq u a l i t yo fs o f t w a r e ,al o to fw o r kh a sb e e nd o n e ,f o r e x a m p l e ,p r o v i d i n gc o m p o n e n t so fh i :曲q u a l i t y h o w e v e r ,c u r r e n td e b u g g i n g f u n c t i o n sa r em a g i cp l a t f o r md e v e l o p e ro r i e n t e d ;d e b u gf a c i l i t yn o wc a nn o tf u l f i l l t h ed e b u g g i n gn e e d so fu s e r s t h i ss u b j e c tb a s e do nt h ed e m a n do fd e b u g g i n gt h e s o f t w a r ep r o d u c e db yp l a t f o r mb yu s e r s d e s i g n sa n dr e a l i z e sad e b u g g i n gs y s t e m f i r s t l y ,t h i ss u b je c td o e sr e s e a r c ho nt h ec o m m o np r o c e d u r eo fd e b u g g i n g , t h ew a y so fd e b u g g i n ga n dt h et e c h n o l o g yo fd e b u g g i n g s e c o n d ,w e bs e r v i c ei s s t u d i e d s e v e r a l k e yc o n c e p t s a r ei n t r o d u c e d ,a n d a p p l i c a t i o n s u n d e rt h e e n v i r o n m e n to fw e bs e r v i c ea r er e s e a r c h e d ,a tt h es a m et i m e ,a na r c h i t e c t u r e b a s e do nw e bs e r v i c ei sp r o v i d e d d u r i n gt h ed e s i g n i n gp a r t ,f i r s t l y ,t h ec l a s s i f i c a t i o no fb u g si sr e s e a r c h e d i t i sd e s c r i b e df r o mt h r e ea n g l e s t h o s ea r es e v e r i t yi n d e x ,t h ed e v e l o p i n gp h a s eo f s o f t w a r ea n do p e r a t i o n a lm o d e l n e x t ,d e b u gs t r a t e g yi ss e t t l e d h o wt oc a t c he x c e p t i o n sb yl e v e la n dh o wt o f i n dt h ep o s i t i o no fe x c e p t i o nb yb u s i n e s sl o g i cl e v e li si n t r o d u c e d a n dt h e n ,t h ea r c h i t e c t u r ei sg i v e n t h e nt h et w of e a t u r e sw h i c ha r et h e c o m b i n a t i o no fl o ga n do p e r a t i o nm o d e l i n ga n dt h ec o m b i n a t i o no fl o ga n d t r a c k i n gt e c h n i q u ea r et a l k e da b o u t n e x t ,c o m p i l i n gs y s t e mi ss i m p l yi n t r o d u c e d d u r i n gt h ei m p l e m e n t a t i o np a r t ,e v e r ym o d u l eo ft h ed e b u g g i n gs y s t e mo f m a g i cp l a t f o r mi nd e t a i li sd e s c r i b e d a tl a s t ,t h ep a p e rs u m m a r i z e st h ew o r ko nt h i si s s u e 哈尔演l :科人学硕十学何论文 k e yw o r d s :d e b u g ;b u g ;l o g ;t r a c e ;w e bs e r v i c e 哈尔滨t 秤大学硕十学何论文 目录 摘要5 a b s t r a c t 6 目录8 第l 章绪论1 1 1 论文选题背景l 1 2国内外研究现状2 1 2 1 b u g 产生的原因一2 1 2 2 软件调试分类3 1 2 3 b u g 调试原则3 1 2 4 调试器6 1 3 论文研究的目标与内容6 1 3 1研究目标6 1 3 2 研究内容7 1 3 3论文组织7 第2 章基本理论与相关技术8 2 1 调试的一般过程8 2 2调试方法l1 2 3调试技术12 2 3 1内存检测工具1 2 2 3 2 编译器13 2 3 3调试器1 4 2 3 4日志15 2 3 5 事件跟踪17 2 4w e bs e r v i c e 技术18 哈尔滨一y - - i :n 人学硕十学何论文 2 4 1 s o a p ( s i m p l eo b j e c ta c c e s sp r o t o c 0 1 ) 18 2 4 2w e bs e r v i c e 简介1 9 2 4 3u d d i ( u n i v e r s a ld e s c r i p t i o nd i s c o v e r ya n di n t e g r a t i o n ) 2 0 2 4 4w e bs e r v i c e 绑定流程2 1 2 4 5w e bs e r v i c e 的用途2 2 2 5 魔力平台2 4 2 5 1产品概述2 4 2 5 2 产品主要功能2 4 2 5 3 魔力平台组成2 5 2 5 4 操作模型2 7 2 6 本章小结一2 8 第3 章调试系统的概要设计2 9 3 1错误分类2 9 3 1 1按严重程度分类2 9 3 1 2 按b u g 所处的软件开发阶段分类3 1 3 1 3 基于操作模型的错误分类3 3 3 2 按层级捕获异常3 4 3 3 调试系统设计一3 6 3 3 1 w e bs e r v i c e 环境下的一般调试过程3 6 3 3 2 魔力平台的调试系统架构3 6 3 3 3综合r 志和操作模型3 8 3 3 4 与跟踪技术结合3 8 3 3 5编译系统4 0 3 4 本章小结4 3 第4 章调试系统的详细设计与实现4 5 4 1 数据库设计4 5 4 1 1 单元测试支持模块4 5 哈尔滨t 秤大学硕十学何论文 4 1 2 信息写入模块4 5 4 2 单元测试支持模块一4 9 4 2 1用例分析4 9 4 2 2 基于w e bs e r v i c e 的通信模块4 9 4 2 3获得实体服务列表4 9 4 2 4 校验实体服务5 0 4 3 信息写入模块51 4 3 1用例分析5 1 4 3 2 详细设计5 2 4 3 3 关于数据流的说明5 4 4 3 4 测试5 5 4 4 跟踪重放模块5 8 4 4 1用例分析5 8 4 4 2 获得跟踪实例列表5 8 4 4 3获得指定实例跟踪信息5 8 4 4 4 删除指定实例跟踪信息5 9 4 5 编译模块一6 0 4 5 1用例分析6 0 4 5 2 获得业务列表6 0 4 5 3 编译指定业务6 0 4 6 本章小结6 1 结论6 2 参考文献6 3 攻读硕士学位期间发表的论文和取得的科研成果6 5 致谢6 6 哈尔滨l :程人学硕十学何论文 第1 章绪论 1 1 论文选题背景 软件业的历史要追溯到上个世纪4 0 年代木。时隔半个多世纪,软件业得 到了迅猛的发展。软件走入了普通人的生活,互联网更是深深渗入了的生活。 统计报告显示,截至2 0 0 8 年底,中国网民数达到2 9 8 亿。越来越依赖软件, 但是软件并不可靠。可能在执行中报错,可能做了一些意料之外的操作,可 能输出了一个本不该提供的结果,可能直接崩溃这些“可能”大多是由 隐藏在软件中的b u g 导致的,b u g 已经成为软件中随时可能发作的隐患。b u g 的存在也增加了软件系统的预算,据统计8 0 的预算都花费在软件的调试和 维护上。 软件中潜伏的b u g ,不仅会给软件的使用带来不便,甚至会导致重大的 生命和经济危害。2 0 0 8 年6 月1 6 日美国“贝宝支付系统”出现一个严重b u g , 导致所有用户无法向其他国家的用户付款。部分用户表示,这一b u g 可能导 致总额达数百万美元的损失。近年来,国内外频繁发生软件系统b u g 引发的 “灾难”,如奥运门票系统瘫痪、沃尔沃速度控制系统失灵等事件,均给企业 和个人用户带来巨额损失。 在软件经历纸带打孔时代、纸带输出到c r t 普及的变迁的同时,调试技 术也在发生翻天覆地的变化。程序从最初的批处理模式,到现在的用户交互 式,用户甚至可以在程序运行期间输入数据。命令行调试器的出现是调试技 术的一次革命。调试器能在给定内存位置提供值,程序员再也不用费劲心力 的猜测内存地址了。程序员可以通过查看寄存器和包含程序中相关值的内存 块来调试程序。这就把调试从不可控的过程变为一个可以重现的过程,使调 试的科学化进程迈出了历史性的一步。 随着调试器的普及,它的易用性也被提上了日程。技术人员发现,它们 可以把变量名映射到程序运行时该变量的物理存储地址上。能查看变量,进 行地址的映像,能支持开发人员依据变量名来查看内存信息,它们以“符号 1 调试 集成 的历 运行 试器 业务 于构 础软 软件 软件 试, 求。 业务 础软 统。 1 2 1 2 1 本身 哈尔滨1 :杵人7 :硕十学何论文 ( 6 ) 没有严格按照需求文档设计开发。 1 2 2 软件调试分类 1 、根据调试方与被调试方的相对位置 本机调试( l o c a ld e b u g g i n g ) 调试双方处于同一台电脑下的同一个操作 系统。 远程调试( r e m o t ed e b u g g i n g ) 调试双方处于不同的计算机系统,通信 方式为计算机网络等。远程调试要求被调试方有一个调试服务器,它负责和 调试器进行通信,收集调试参数,发送调试请求,获得调试结果。 2 、根据被调试方的活动性 活动目标调试( l i v et a r g e td e b u g g i n g ) :实时调试运行的程序。 转储文件调试( d u m pf i l ed e b u g g i n g ) :转储文件是在发生错误时创建 的,它将被调试方的内存状态信息存入文件,有助于诊断问题。写至转储文 件的每个数据项都具有与其相关联的时间戳记,以帮助进行问题确定。 3 、根据软件所在的不同阶段( 以产品的正式发布作为分界) 开发期调试 产品期调试:解决产品发布以后出现的问题,这些问题来自于用户通过 电话、电子邮件等方式汇报的问题,或者通过自动错误报告机制获得。其难 度相对较大。 4 、根据是否使用调试器 使用调试器的软件调试:可支持断点、跟踪执行等强大的调试功能。 不使用调试器的软件调试:依靠同志文件、输出调试信息、查看内存信 息等。 1 2 3 b u g 调试原则 软件的发展越来越快,软件系统的规模也千差万别,从几行代码的小程 序到百万行代码的大型程序,有效的调试的技术也大相径庭。应用在不同环 境的调试技术,是由这些系统的特征决定的。当然,调试某个特定系统时, 3 一 哈尔滨i :稃人学硕十学何论文 软件系统测试人员测试通过后,开始给用户部署软件系统。用户使用时 出现了问题,可是在测试的人员那里,软件系统运行正常。最后才发现用户 的操作系统是w i n 2 0 0 3 ,而调试人员的机器是w i n d o w sx p 。应该在程序可能运 行的所有操作系统版本下测试,这样才能确保程序在这些系统中不会出现问 题。 第三、输入输出问题。 小规模系统下很多错误由非法输入引起,也表现为异常的输出。如果将 输入控制在合理的范围内,就能解决不少问题。 2 、中规模客户月艮务器系统 这类系统往往会有一个存储系统来支撑,通常表现为数据库。虽然你可 以随意录入一些值来测试,但是建议使用更接近实际数据库的数据来测试。 一方面,问题可能隐藏在真实数据中。另一方面,使用真实数据会使调试过 程更加容易。 恢复问题发生的现场。如果问题是在多用户并发的情况下出现的,那么 仅仅有1 名测试人员操作是不可能发现问题的。 3 、大规模系统 大规模系统的错误是最难于调试的,你不能想象同时有多少个用户在访 问系统。 这种情况下,可以考虑给系统设置一个“后门”。用“后门”提供的特殊 用户登录,这个用户能查看系统的调试输出信息、能对系统的错误进行跟踪 监测,这样就能即时了解系统的运行情况。如果系统发生了死锁,就能迅速 定位问题点和受影响的用户。 4 、分布式系统 分布式系统是在不同组件上运行的系统,很可能是多机环境。分布式系 统具有很强的不确定性,你不确定它会走哪个分支。分布式系统又往往是多 语言、跨平台、多机器的,使调试更加困难。但是分布式系统的调试仍然有 规律可循。 。 s 哈尔滨r 稃人学硕十学何论文 i i - ii i i i - _ - l i - l _ l _ _ l i - i _ _ i i i i i i i i i i i 第一、中间构件错误。系统对中间构件的不正确调用导致错误。这些中 间构件往往是没有源码的。如果是这类错误,要么更换其他构件,要么去掉 该构件中引发问题的部分功能。避免这类错误的最好方法就是使用构件前对 构件的方法做全面的测试。 第二、连接失败。如果一个构件调用了另一个构件,就可能出现这类错 误。在分布式系统中,这类错误很常见。 第三、安全策略引发的错误。比如后台服务器要往磁盘上写一个文件, 而服务器的安全策略不允许这样做,就会出现安全错误。 第四、事后的分析。引发系统崩溃的问题是共享资源处理问题还是系统 对多用户并发支持存在漏洞? 崩溃后进行分析对于系统的长远发展是很有意 义的,注意充分利用系统日志。 1 2 4 调试器 虽然从计算机软件诞生之同起,调试这项艰难而繁杂的任务就落到了人 们身上,调试器却是在很长一段时间之后才走入人们的视线。如今,调试器 已经成为软件开发者的利器,常见的i d e 都附带一个非常易用、直观的调 试器。比如e c l i p s e 就提供了一个功能十分全面,操作十分简单的可视化调 试器,它提供所有的标准调试功能,包括设置断点、设置值、单步执行、查 看变量值、挂起线程和恢复线程等等。此外,它还支持调试在远程机器上运 行的应用程序。即使程序运行在远程的环境下,即使运行环境不允许控制台 输出,即使无法获取终端的输出,程序员仍然能在调试器的帮助下观察和测 试运行态中的环境。功能强大的调试器,大大加快了程序的开发的进程。 1 3 论文研究的目标与内容 1 3 1 研究目标 ( 1 ) 研究调试的一般过程、调试方法和调试技术; ( 2 ) 研究w e bs e r v i c e 环境下的一般应用; 6 哈尔滨i :稃大学硕十学何论文 ( 3 ) 研究错误分类和调试策略; ( 4 ) 设计基于操作模型的魔力平台可视化调试系统的体系结构; ( 5 ) 实现基于操作模型的魔力平台可视化调试系统的功能。 1 3 2 研究内容 ( 1 ) 一般调试过程、调试技术研究; ( 2 ) w e bs e r v i c e 环境下的应用研究; ( 3 ) 错误分类研究及调试策略确定; ( 4 ) 调试系统的概要设计; ( 5 ) 调试系统的实现。 1 3 3 论文组织 本文共四章,按如下方式组织: 第1 章介绍了本课题的选题背景、国内外研究现状、论文研究的目的和 意义、论文研究的目标与内容;概述了b u g 的由来、调试原则以及相关的内 容;阐述了作者在本课题中的工作内容;提出了论文的大纲。 第2 章综述了课题的基本理论与相关技术,简要地介绍了调试的一般工 程、调试技术、w e bs e r v i c e 技术及调试系统所属的大环境一一魔力平台。 第3 章说明了调试系统的分析和设计过程,确立魔力平台调试系统采用 “运行环境实时记录时间点的原子操作,开发环境解析日志并定位错误”的 调试策略。 第4 章介绍了调试系统的体系结构,调试系统的各个模块的功能以及其 具体的实现方式;阐述了作者在课题的设计过程中遇到的一些问题以及解决 的办法。 7 哈尔滨t 程人学硕十学位论文 第2 章基本理论与相关技术 2 1 调试的一般过程 一个完整的软件调试过程主要由四步组成,如图2 1 所示: 图2 1 软件调试过程 1 、再现故障 一份完整的错误报告不仅仅要有错误描述,还应包含错误复现步骤,即 经过怎样的一系列操作,使故障现象出现。错误能否再现很重要,尤其是一 些在特定条件下才会出现的错误,是否有完整的再现步骤直接关系到错误能 否解决。而人们常常只是报告某某错误出现了,忽略了对再现步骤的描述, 这样的错误报告往往让调试人员无从下手。 2 、b u g 定位 一般b u g 报告上会记载b u g 的描述、严重程度、运行环境等,即b u g 的 外在表现。软件b u g 通常分为两类:软件功能与需求文档中的功能描述不符; 软件运行时做了不该做的事。从b u g 报告入手,先找到引发b u g 的直接原因。 接下来,需要借助工具,使用调试手段,寻找问题的根源,即软件内部原因。 3 、寻找解决方案 根据分析出的引发b u g 的软件内部原因,综合考虑软件运行环境和问题 紧迫性,找出适宜的解决方案。考虑到特定场合下,解决方案的通用性,对 历史b u g 的处理应做记录,以供同后参考。 解决方案不是凭空想象,是在收集了尽可能多的b u g 相关信息的基础上 得来。信息来源于以下几个方面 8 哈尔滨t 程大学硕十学位论文 ( 1 ) 用户对问题的描述 问题的第一手描述是非常重要的,所以一定要准确的记录所听到的。对 比不同的用户对同一问题的阐述,看是否有相似点。要注意的一点是,用户 提交的报告常常有这样的描述“系统运行一段时间之后突然崩溃”,这类报告 没有提供任何有用的信息。系统崩溃之前执行了什么操作,操作的顺序是什 么? 只有提供了足够让问题重现的信息,才能发现问题的根本原因。 ( 2 ) 同志信息 同志是进行观察的很好的材料。日志可以帮助我们查明问题信息。当然, 前提是,日志包含了待查问题的信息。确定把哪些信息写入日志也是很重要 的。日志有一个简单的规则:详细的错误信息,简单的一般事件。 ( 3 ) 自己的观察 没有调查就没有发言权,作为一名调试人员,想了解所发生的问题,最 可行的方法就是亲自去观察。不要带有偏见,不应考虑代码,也不要考虑错 误是发生在哪个子系统。看着问题再现,记录自己的操作和现象,对于后期 的工作是有很大帮助的。 ( 4 ) 系统症状 调试一个应用系统时,开发人员和调试人员常常忽略而且不跟踪观察的 信息。有时候,症状就是实际的b u g 。而另外一些时候,症状只是表面现象, 真j 下的b u g 隐藏在下面。跟踪症状最好建立一个所影响的相关子系统的树, 如果几个b u g 在某个点重叠,就应该逐个子系统的查看如何影响症状。如果 单个子系统导致了所有子系统集中观察的症状,那么解决了这一个问题就可 以消除所有b u g 。 ( 5 ) 失败的测试用例 失败的测试用例能很好的说明问题。即使是一个简单的失败实例,也常 常能反映底层的问题。分析失败的原因,是发现应用程序如何才能更好的工 作的好方法。如此同时,b u g 报告往往包含很多冗余的步骤,通过测试实例 来发现问题更加快捷和容易。无论足再现问题还是修复b u g 。 9 哈尔滨一f j 稃人学硕十学何论文 ( 6 ) 相似的问题 把出现的b u g 存入一个b u g 列表,而不是仅限于修复它。但出现一个新 的b u g 时,查看b u g 列表,往往能发现相似的b u g 。通过了解什么问题导致 从前的b u g ,往往就能明白现在的b u g 出现的原因。 ( 7 ) 最近的修改 当一个应用程序出现新问题之后,虽然有可能是由于外部环境的改变或 者新的输入数据,但也有可能是软件的修改,尤其是最近的修改。只有近期 修改的部分是最不稳定的,因为对近期的代码测试是最不充分的。为了避免 遗忘,修改后及时写入版本说明是必要的。 ( 8 ) 运行的环境信息 软件运行的环境和其他外部因素也会对软件的运行造成影响,软件不是 孤立的。如果这些因素发生了改变,程序可能会受到影响。 在认识到的确存在一个问题,也了解了用户描述的问题本质,又收集了 所有能获得的信息,现在该看看程序到底在做什么了。一般情况下b u g 会属 于以下类别:内存错误、编码错误、逻辑错误、需求错误、条件错误、定时 多线程错误、外部错误。不是所有的b u g 都能归入这些类别,当然,你也可 以根据自己系统的实际情况束划分更适宜你的应用系统的b u g 类别。只是归 类的思想使调试的工作更容易进行。根据已有的信息,我们进行了假设,往 往是多个。 4 、验证方案 在应用环境用运行软件,以测试解决方案的有效性。此过程会有2 种结 果。解决问题,关闭当前b u g ;未解决问题,回到第3 步,对已选方案进行 调整,而后重新验证。 为了充分测试问题,要做几件事。一、保证你认为发生的事确实在发生。 二、证明假设的基础是问题的根本原因。三、预测给定输入后,将会发生什 么。对假设的证明要遵循标准的证明规则。证明、假设、再证明。 1 0 哈尔滨一r 程大学硕十学位论文 2 2 调试方法 软件调试的重要性毋庸置疑,但是人们往往忽视了调试过程的科学性, 在调试上蛮干是不可取的。采用合理的调试方法能产生事半功倍的效果,而 方法上的失误也常常导致效率低下。关于调试方法,介绍如下: ( 1 ) 采用科学的方法进行调试。调试时要多思考,仔细分析问题的症状。 可以试着描述这个问题,这往往对解决问题有所启发。请求其他人帮助,正 如人们常说的“当局者迷,旁观者清”。如果调试过程中卡住了,百思不得其 解,可以过一段时间再考虑,往往问题就迎刃而解。建议逐个排除问题,同 时修改多个问题会引入不必要的复杂度。除非所有办法都试过了,才考虑“暴 力”调试法,这种方法虽然普遍,但是效果不佳; ( 2 ) b u g 定位根据经验推断。对软件各部分比较熟悉的人,使用该方法 更有效。以前出现过错误的地方,往往会潜伏着更多的错误。先根据以往的 调试经验列出可能出错的地方。然后逐一检查,在此过程中排除不相关的假 设。最后剩下的往往就是最可能的原因了; ( 3 ) 有根据的猜测。该方法需要在已经执行过相当多的测试用例之后使 用。收集尽可能多的执行数据,无论是正确执行的,还是出现异常的。整理 并对比这些数据,寻找切入点。对这些执行数据,进行细致而周密的分析, 探寻更深层的错误根源。不要忽视那些未引发错误的对比用例,有时它们更 容易帮你发现问题; ( 4 ) 诊断。确定错误后,对症处理。最终把问题剔除了,调试过程才算 成功。不仅仅满足于解决表面问题,也包括更深层的问题。有时,诊断专指 一种特殊的调试方法,即对程序的执行中可能出现的问题进行预言和跟踪, 一旦问题出现,即时对问题发生点、发生时间、问题描述进行记录。这种方 法的缺陷是没有对引发问题的原因进行记录。 哈尔滨i :样人。硕十字:伉论文 2 3 调试技术 2 3 1内存检测工具 1 、常见内存检测工具 ( 1 ) c c m a l l o c - - 一个内存分析器,能够检测内存泄露、检测同一数据的 多次内存分配、检测对已释放内存的访问、提供释放和分配统计等。 ( 2 ) j a v a s c r i p tm e m o 巧l e a kd e t e c t o r 一由一名来自于微软欧洲 g p d e ( g l o b a lp r o d u c td e v e l o p m e n t e u r o p et e a m ) 团队的开发人员研发的,用 于检测j a v a s c r i p t 代码中的内存泄露的调试工具。它以浏览器插件的形式使 用,可以在i e 进程中加载。 ( 3 ) e l e c t r i cf e n c e 一一款内存调试器,程序员可以用它的调试库替换c 的标准内存管理库。当发生内存错误时,它将引发程序崩溃,进而调试人员 就可以查看引发错误的代码了。 ( 4 ) m e m w a t c h 一用于c 语言的内存泄露检测工具,它可以在任何有 a n s ic 编译器的系统上编译和运行。 ( 5 ) v a l g r i n d 一用于内存调试、内存泄露检测、内存分析。 ( 6 ) a q t i m e - - 由a u t o m a t e d q a 研发的性能分析器和内存资源调试工具 集。它用于在多任务情况下改善程序性能和跟踪内存使用情况。 ( 7 ) j p r o b e 一企业级的j a v a 分析器,提供对于内存使用、性能、覆盖测 试的智能诊断,使得开发人员迅速定位并修复影响程序性能和稳定性的错误。 ( 8 ) i n s u 时+ 一内存调试器,由p a r a s o f t 研制,用于检测多种多样的c 和c + h 程序的错误。 ( 9 ) j p r o f i l e r 一由e j - t e c h n o l o g i e s 研发的用于j 2 e e 和j 2 s e 应用程序的 j a v a 调试器。 ( 1 0 ) d e v p a r t n e r - - 由n u m e g a 研发的一组用于软件开发和调试的工具 集,有针对n e t 、j a v a 、c c + + 的单独版本。 ( 1 1 ) p u r i f y 一内存调试工具用于检测内存访问错误,特别适用于c 和 1 2 哈尔滨t 稃人? 硕十予:何论文 1 11 c + + 程序。 ( 1 2 ) s a pm e m o r ya n a l y z e r 一一个快速且功能丰富的堆分析器,它能帮 助你发现大的内存块并辨别谁在维护这些对象,它对资源的消耗相对较低。 2 、常见内存错误 ( 1 ) 内存泄漏。分配内存并使用完毕后,未进行释放,操作系统又不能 自动回收,导致可用内存不断消耗。 ( 2 ) 内存访问异常。比如已经释放的内存,重复释放或访问等等。 ( 3 ) 内存写越界。写操作时超过了合理的地址范围。 ( 4 ) 指针错误。指针指向了无效的内存地址。 2 3 2 编译器 编译器是将便于人们阅读、编辑的高级程序语言转化为更接近于机器语 言的低级语言的程序,其中高级程序语言作为输入( s o u r c ec o d e ) ,即源代码 低级语言作为输出,即目标代码( t a r g e tc o d e ) ,从源代码到目标代码的翻译过 程即为编译。 编译器通常由3 部分组成,即预处理器( p r e p r o c e s s o r ) :负责将预定义内 容代入源程序;编译器前端( f r o n te n d ) :负责解析输入程序,包括语法分析 器和语义分析器;编译器后端( b a c ke n d ) :负责优化中间代码,生成目标代 码。编译器的工作过程如下:进行语法分析;进行语义分析;生成目标代码。 编译器分析( c o m p i l e ra n a l y s i s ) 针对中间代码进行。中间代码常常分为多 级层次结构。高级中间代码( h i g hl e v e li r ) 是语言相关的,它更接近输入的 高级语言,无论是从程序结构还是从语言形式上;中级中间代码( m i d d l el e v e l i r ) 是语言无关的,它是输入无关的;低级中间代码( l o wl e v e li r ) 更接近 机器语言。 常见的优化和转换包括:内嵌( i n l i n e ) ,垃圾代码清除( d e a dc o d e e l i m i n a t i o n ) ,循环标准化( 1 0 0 p n o r m a l i z a t i o n ) ,循环展开( 1 0 0 pu n r o l l i n g ) , 循环合并( 1 0 0 pf u s i o n ) ,循环分裂( 1 0 0 pf i s s i o n ) ,数组填充( a r r a yp a d d i n g ) , 1 3 哈尔演f :稃大学硕十学位论文 等等。优化和转换的作用如下:精简代码、优化存储系统,甚至可以把串行 转换为并行,把单线程转换为多线程。 那编译器如何用于调试呢? ( 1 ) 巧用高警告级别。首先编译器起到协助检查的作用。有时将警告设 置为必须处理,会促使写代码的人更严谨的对待他的作品,无论是从遵守代 码规范上,还是从避免代码冗余上;其次,编译器的编写者需要尝试通过阅 读代码来发现错误,从而确立编译器的工作逻辑。比如对于未初始化就使用 的情况,如何人工识别,进而如何让编译器识别。一旦编译器丌始自动检测 错误,人们就真的可以“一劳永逸”了。 ( 2 ) 查看来自编译器的消息。编译器能发现己定义却从未使用的对象, 也能识别从未被引用的方法。当然,对未声明类的引用同样难逃编译器的法 眼。所有这些信息,编译器都会以消息的形式返回。所以,好好利用这些消 息,将让你的调试工作事半功倍。 2 3 3 调试器 1 、调试器的发展 第一个比较有名的调试器d e b u g c o m 出现在m s d o s 系统中。它很简单, 但是不够好用,不受大众欢迎。尽管新的调试器不断涌现,但是在原理上和 d e b u g c o m 并没有多大区别。m s d o s 时代,调试器处于弱势群体,一旦键 盘被锁、中断被禁止、不允许追踪,调试器就无用武之地了。 直到8 0 2 8 6 处理器时代,用于破解的调试器a f dp r o 的出现才打破冰山 一角。1 9 8 9 年,有名的t u r b od e b u g g e r 问世,作者是c h r i s 和r i c hw i l l i a m s 。 1 9 9 1 年,s e r g ep a c h k o v s k y 编写了第一个仿真调试器。然而,上述调试器对 堆栈、屏幕、键盘等相关的问题不能很好的处理。 随着8 0 3 8 6 微处理的出现,软件复杂度不断增长,调试器已经渐渐深入 保护机制的后院。上世纪8 0 年代末,n u m e g a 发布了品质超群的调试器 s o f t l c e ,至今仍为人们所欢迎。由于软件复杂度增长不仅受机器本身配置的 1 4 哈尔滨i :样大学硕十学伊论文 限制,还受到检错和纠错的制约,英特尔公司在其8 0 3 8 6 处理器中加入了一 些特殊部件,以从硬件层级控制代码的执行。至此,保护机制瓦解了。n u m e g a 随即发布了一款针对8 0 3 8 6 的调试器。紧接着,出现了新的操作系统 w i n d o w s ,而微软提供的内置调试器庞大、速度慢、易用性差。n u m e g a 适时 推出了一款新的调试器,而它不依赖于操作系统,直接和硬件打交道或者说 它处于硬件和操作系统之间的层级。它甚至使调试操作系统内核成为可能, 自然的,它得到了人们的广泛欢迎。 2 、调试器的使用场合 调试器的使用场合:小规模的单机系统、可以从控制台运行的系统、不 考虑多用户同时发生错误的复杂系统。 不提倡使用调试器的场合:多用户并发错误的复杂系统、已经到产品阶 段的应用系统、时问相关系统、使用调试器可能引发崩溃的系统。 2 3 4日志 监视一个程序的运行过程,记录程序运行的日志是一个追踪事件的好办 法。同志不仅可以帮助收集到所有的信息,找到问题的所在,而且对于后续 的开发人员,同志也是很有价值的。传统的日志跟踪有一个最大的优点也是 最大的缺点:日志中的信息过于繁杂交错,即使详细的查看,仍然容易错过 个别问题。所以,传统的日志分析常用于粗略估计问题。日志是程序对自身 行为轨迹的记录,每一条记录描述了一个事件。一条日志记录常常包括以下 内容: 。 ( 1 ) 事件发生时问:通常精确到分钟。对于实时系统,有时精确到秒级 或者更细粒度。时间和同期的重要性是有原因的。一旦知道了事件发生的时 间,就可以快速查看当时的数据等信息,以发现到底发生了什么; ( 2 ) 所属模块:事件发生地点的描述。有了问题代码的定位信息,就可 以避免搜索项目中所有的模块,节省调试时间; ( 3 ) 事件主体:事件执行者,常常是某个类的某个对象; 1 5 哈尔滨r 稃大学硕十学位论文 ( 4 ) 事件描述:对发生了什么的描述,这个一般是详细信息; ( 5 ) 事件级别:如果同时发生了多个错误,那么对错误进行分级记录有 助于迅速发现严重的错误。通常分为3 种,即错误( e r r o r ) 、警告( w a r n i n g ) 、 提示( i n f o r m a t i o n ) 。 相信每位调试人员都被不能再现的问题困扰过。有时直接运行错误出现, 而一旦使用调试器检测,问题就不再出现了。也许大家还记得“海森堡测不 准”原理,大意是的测量活动会对实验本身造成影响,加入了测量过程得到 的实验数据是有偏差的。同样的道理,加入了调试活动的应用程序同样也会 受到影响。那怎么样才能处理这些不能再现又难于调试的问题呢? 同志就是 解决方法之一。事件一旦发生,日志系统就会记录在案,即便不能再现,各 种有用的信息也都记录下来了。于是日志就成了帮助分析和定位故障的重要 工具了。 此外,对于产品期的软件调试,此时,直接调试几乎是不可能进行,日 志就显得尤为重要了。 日志输出目标有如下3 类: ( 1 ) 文件 ( 2 ) 数据库 ( 3 ) 用户界面 为了让日志方法更灵活、可配置,可以搭配使用配置文件。在配置文件 中对如下信息进行设置:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论