测试工具?? 有没有功能全面一点的测试工具推荐几个最好有下载地址不要太复杂化了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 delphi自带的测试功能已经够了 单元测试工具:DUnit,去www.sf.net上搜,开源D,使用方法也简单。内存检测工具:MemProof,随便去个网站上找,使用方法更简单。 或者BoundChecker,这个检测就严格了一些,我不是很喜欢。 FROM 葵花宝典声 明一、 关于在Internet网上转发本文件的声明本文件的撰写目的是出自作者所在公司(河南省豫能信息技术有限公司)的工作需要。作者在Internet上公开本文纯属个人行为。任何个人或者机构可以在Internet上自由的转发和引用本文。但转发过程中必须保证本文的完整性,不得进行任何的修改。作者允许任何个人或者机构在本文的转发过程中附带其它的文件来描述、补充或者评价本文。但不得在本文的原文中修改。本文不做任何加密和权限设置,以方便读者的转发和转阅。本文全文及其它个人或者机构补充的文档压缩在同一.zip包裹中发布。二、 关于在传统媒体上刊载、使用、引用本文件的声明 禁止在未经本人书面(含电子邮件)许可的情况下在传统媒体上刊载、使用、引用本文件的部分或全部内容。如果确需刊载、使用、引用本文件,请用Mail与本人联系。本人联系Mail:[email protected]或[email protected]。三、 关于本文件可能携带的其它个人或机构的文档的声明凡在本文件的压缩包中添加的文档均可自由地在Internet网上转发。——“加入本文件的压缩包”将被视为许可本项声明条款的行为。其它文档如果有不同的声明,请在相应文档中另附。豫能信息技术有限公司开发部测试、调试软件软件使用评测计划(评测报告)为了在公司的软件开发过程中实施质量检测,保障产品质量,提高后期维护和整改的力度,特提出本使用评测计划。在本评测报告中不详细描述评测的方法,仅描述结果和评测中的建议。一、 评测对象在收集的各种代码测试、调试软件中,我筛选了四种软件作为评测对象,开发人员可以根据工程大小、实施测试的阶段选用不同的软件。这三种软件分别是:1. GpProfile Version 1.332. CodeSite Version 2.03. Eureka Exception Log Version 3.14. AQTime Version 2.05. BoundsCheck Version 6.5所选评测对象仅适用于开发人员在开发和维护进行的过程中对软件产品进行测试和调试,不适用于公司测试组的工作。二、 评测报告一:GpProfile Version 1.33(一) GpProfile的简介GpProfile是一个开放源码的Delphi项目。它是由Primoz Gabrijelcic主持开发实施的。他所主持开发的项目还包括:? TP Lex/Yacc 3.0 : 一个语言生成和语法检测工具? GpHugeFile : 一个用来处理超大文件的Delphi组件等。GpProfile被大量的工具软件厂商应用在自已的产品开发中。如: Delphi-BOX的INF-Tool,Lars Akerman Software的CGI Expert,Femte Gear Internet Software的Pixel Pack和Duncan Amplification的Disk2Disk等都在开发过程中使用了GpProfile。(二) GpProfile的特点GpProfile的特点包括:? 开放源码? 在分析的全过程实现了项目源代码组合? 能分析DLL,EXE和.DPK包裹文件等多种项目类型? 支持多线程? 支持条件编译标志设置两种方法分析标签设置方法? 能清晰地显示函数/类之间的调用结构关系? 支持测试报告的导出,可形成标准的LOG文件格式,提供第三方接口? 可以在应用程序中控制GpProfile的分析,提供API(三) GpProfile的适用对象和适用阶段分析GpProfile仅适用于在Delphi开发过程中用来测试类/函数的执行效率,简单地说,它是一个效率分析工具。GpProfile分析地全过程是基于程序的调试代码的,同时,它要求你具有项目的源代码。这意味着,你不能用它来分析没有源代码的第三方控件和DLL/ActiveX对象。由于GpProfile实际上不对源代码的质量做任何地评估,而只是简单的引用。此外,它需要你的编译程序有调试信息并至少完整地运行过一次。因此,GGProfile适合于你发布产品的测试版本,或者交付用户进行测试的情况。GpProfile不对程序的错误做任何的控制。你必须当心你的程序崩溃而导致GpProfile什么也分析不到。因为GpProfile需要基于你的应用正常退出后生成的记录文件来分析。GpProfile通过.DCU提供能在你的程序内部调用的API,使你可以在应用程序的任何位置停止并驱动GpProfile展开分析。这使应用程序在意外中止之间至少有一次机会保存记录。(四) GpProfile的使用方法GpProfile可能是我在测试中见过使用方法最简单的一套性能分析工具。下面简要介始它的使用方法:1. 启动启动GpProfile至少有两种方法:? 从Delphi IDE Tools中启动? 直接启动2. 打开测试项目接下来,你可以打开一个测试项目。对于GpProfile来说,你只能打开.DPR或者.DPK文件来做测试项目。如果你从Delphi IDE从启动GpProfile,则IDE中的当前项目将直接成为GpProfile的测试项目。3. 选定测试对象在GpProfile的主窗体中,有Instrumentation页,在该页中,你可以见到在测试项目中的全部的函数和类的Procedure/Function接口。这些是你可选的测试对象。你可以选择类/函数的复杂组合作为测试对象。完成选择之后,你需要点一下 按钮,将选择对象组合到你的源代码中。当然,如果你已经设置好源代码的编译开关,你也可以直接按 按钮来一步完成组合->编译->运行应用程序这全部的工作。如果你在Delphi中打开了组合的过程/函数所在的单元,则你会在Delphi IDE中收到一个要求重新载入源程序的消息。此时,你应该选“确定”。4. 编译应用程序GpProfile不需要你对应用程序的编译选项做任何的特殊配置。但你必而编译一个新的应用程序来将GpProfile的代码组合到你的目标程序中。当然,你也可以在Delphi IDE环境中选“运行”,而不必直接编译目标文件。5. 运行应用程序接下来,你需要运行应用程序。在GpProfile中,这一步最至关重要,也最容易出错。在较简单的情况下,运行程序直到应用程序结束,被组合应用程序中组合进的GpProfile的代码将会自动在应用程序所在目录生成*.prf文件,这就是分析用的记录文件。但某些程序下,如果你的应用程序不是正常中止的,可能你无法有效地得到.prf文件。这时,你可能要在你的源代码中加入一些针对于GpProfile的控制代码。关于这一部分,你可以在GpProfile的Help中查看关于它的API的说明。此外,一个实例是关于ISAPI的,在Delphi IDE中运行并中止ISAPI DLL时,并不会生成报告。这可能与IIS的线程处理机制有关。但你可以不使用调试模式,并通过IIS服务管理器来中止ISAPI,这样,你就可以得到检测报告了。6. 查看测试报告如果在运行应用程序时,你GpProfile开着。那么,你的应用程序结束时,GpProfile会自动打开测试报告。否则,你应该在GpProfile的主界面中,选择Profile\Open菜单,到应用程序所在目录中去打开测试报告。(五) 存在的问题OH...好象问题不多,哈哈~~~~~~? 不要指望它能给你调试程序带来任何的帮助。? 不要指望你能通过它来给没有源代码的项目做任何分析。? 有没有人能告诉我它的“Layout”菜单有什么用。^-^? Layout Manager的对话框中有一个小BUG。? 在启动或中止替换图片时可能会发生一个错误,此时你需要更换新的Comctl32。? 出于安装程序的问题,在Win95/98中,可能无法将GpProfile安装到Delphi IDE中,你可以运行GPPROF /REGISTER命令来手工安装它。? 不能处理对{$INCLUDE}包含文件中的过程的组合。? 对Remote Profile分析的处理不是太理想(六) 其它千万别用ProDelphi。那将给你带来一场灾难。它会将你的源代码改得一塌糊涂,至少我用过的ProDelphi Version 9.4是这样。——而GpProfile中提供了很好的Remove Instrumentation功能。 三、 评测报告二:CodeSite Version 2.0(一) CodeSite的简介CodeSite实在是一个不可多得的调试辅助工具。——OH,首先请记住的,它是一个调试辅助工具,而GpProfile是一个代码性能分析工具。CodeSite最大的作用是将你的应用程序中的运行情况通过CodeViewer显示出来。他可以实时地反映这些信息。同时,他也能将应用程序发生异常时的系统状况真实地反映出来,包括Memory Buffer、Strack、Class Object以及VCL等等。此外,你还可以定制发向CodeViewer的数据的格式(当然,你也同时要为这种数据格式在CodeViewer中书写一个接收器插件)。CodeSite Version 2.0获得了2000年度Delphi Informant读者选择的最佳调试工具奖。它是一个商业级控件,是著名的Raize公司的代表作品。Raize还出品了Raize Component Pack,估记已是无人不知了。(二) CodeSite的特点CodeSite通过它自己的组件将代码完全集成到Delphi所编译的应用程序的内部。事实上,CodeSite更象是提供了两个非可视控件来生成程序运行记录。正如Hubdog所说,它更象是Delphi EventLog的一个扩展版本。* Hubdog:国内一个很不错的Delphi程序员。他所整理的《Delphi之未经证实的葵花宝典2.5》可以说是我编程的备查手册,不过好象已经停止更新了。但CodeSite具有它自身独有的特点:? 有一个功能强大的、可在消息源中定制路由的消息转发器。? 消息中对消息路由的控制采用字符串,容易实现用户配置。? 强大的第三方插件和工具支持。? 可定制的消息格式和完善的接口。? 消息控制可以完美地嵌入Delphi应用程序内部。? 支持远程消息发送,支持TCP/UDP协议。? 商业级地产品后期支持。(三) CodeSite的适用对象和适用阶段分析CodeSite完全不适合一个没有源程序的应用程序。CodeSite并不是一个适合在调试期使用的产品。它不产生调试代码,也不对程序的运行做任何的控制和分析。CodeSite适合于在产品分发的Beta版中使用。它不是一个理想的远程代码维护工具,但它是绝对一个是好的远程代码运行情况的Monitor。CodeSite不能给你的的代码调试带来任何主动的建议,请自行分析它的数据和报告。CodeSite只是静态的提供程序运行期的各种程序内部对象的状态数据,分析是你自己的工作。(四) CodeSite的使用方法请参考Hobdog的《CodeSite Pro 2.0应用指南》。——这是一份精彩的手册,我想我对它的任何补充都是画蛇添足。(五) 存在的问题没有真正完美的东西。——于这一点,请相信我。最大的问题是CodeSite缺乏分析报告。甚至,他连一些简单的统计(当然,更别说分析)工作都没有做。天啊,从一大堆数据中去逐行分析一个程序流程与看《完全自杀手册》难道有什么区别吗?有一点值得庆幸的是,它还是在CodeSite中加入了一个Filter工具。——写到这儿,Aiming偷偷地抹了一把冷汗。^-^问题之二来源于CodeSite Dispatcher(CodeSite专用的消息分发器)。如果消息要发向的目标是一个局域网用户,CodeSite通过TCP/IP协议只能发向一个Internet用户。那么,如何能接收到这个消息呢?解决的方法至少有两种,一个是在局域网的对外的服务器上再装一个CodeSite Dispatcher,由它来转发给局域网用户;另一种是在CodeSite内部通过专用格式的TCP/UDP报文头来要求网关向内部网转发。问题是,这两种方法CodeSite一个都没有实现。其三,CodeSite并不通告运行应用程序的用户它在后台发出消息。因此,在一些私人数据敏感的软件中加入CodeSite时,请你自行向用户提示。这可能是你必须要做的一件事。——在文档中、授权中,或者弹出一个消息框来告诉用户:OH,Mr. or Mrs. I’ll send some message to my father. Can I do this? Yes or NO?其四,请考虑在你的源码中加入CodeSite的代码的时候加入条件编译语句。这样可以你使你在正式发布产品时节省很大的力气。不过,说实在的,我总是近于顽固地认为这是Raize来做的事情。(六) 其它如果你不是极端完美主意者,那么,强烈建议你在发布Beta时选用CodeSite。并且,同时建议从你的应用中彻底地清除掉那些用于写LogFile或者向事件查看器发消息的代码。Aiming的代码库pubUnit.pas中的Funtion SendMessageLog()可以删除掉了. 四、 评测报告三:Eureka Exception Log Version 3.1(一) Eureka Exception Log的简介在我见到Eureka Exception Log之前,ExceptionalMagic一直是一个非常不错的替代品。但当我很偶然地发现Eureka Exception Log之后,我就决定放弃ExceptionalMagic了。这里顺便先说说ExceptionalMagic(EM)。EM是Dimus UNLEASHED发布的一个Delphi异常报告工具(在这一点上是与Eureka Exception Log一致的),EM发布的正式版本带有全套源码,售价也仅有50$。同时,它能够在提示异常时显示堆栈、寄存器和定位源代码行(含VCL/RTL),并显示用户定制错误消息对话框或者写入Log文件。可以说是很不错的选择。但影响我此次选择的最重要原因是EM几乎是停止维护的产品。——自2000.4.20发布1.51之后,EM几乎就不再出新版本。2001.10.31日EM又发布了一个Ver1.6 Beta给注册用户测试,但接下来一点消息也没有了。因此,我只好选择Eureka作为我的评测对象,因为Eureka Exception Log的功能实在比EM易用得多。* 我很少会在两个带与不带源码的产品中选择后者,但Eureka占胜了我的习惯。由此我想,在软件行业中,服务是第一位的。——这也算做题外话吧。Eureka Exception Log(EEL)出自Eureka,该公司似乎只开发这个产品。EEL的最新版本是3.1,支持Delphi 6,售价是28$/78$。(二) Eureka Exception Log的特点EEL和EM是同一类产品,它们都是在程序发生异常时截断Delphi的异常处理流程,然后给用户/开发人员最后一次处理异常的机会。通常情况下,EEL和EM都建议你将错误显示给用户或者写入Log文件。不同的是,EEL提供了在出错时发送Mail的功能。EEL的特点主要表现在:? 很完美地与Delphi IDE的组合在一起,异常处理过程几乎不需要编码。? 目标代码增大的情况不严重(仅增大25K)。? 多种错误显示和提交方式,选项多而实用。? 错误提示可以使用你指定的任何语言,可定制性极高。? 支持包、DLL和多线程应用。? 提供面向CGI应用的接口,可以将错误显示成HTML页。(三) Eureka Exception Log的适用对象和适用阶段分析当然,EEL也只适合于有程序源代码的情况。不过,它并不要求你所使用的控件也有源程序。——只要第三方控件的.DCU带有调试信息,则EEL可以对发生的异常定位到源代码行。否则,它只会告诉你在这个单元中发生了错误。EEL和CodeSite一样,都用于在一个远端程序中收集程序的运行状态信息。不同的时,EEL的仅限于收集异常信息,并且它显示信息的对象是同时面向软件用户和开发人员的。而CodeSite的信息比ELL全面庞杂,仅提供给开发人员使用。EEL可以用于面向开发人员的测试版(alpha),也可以用于面向用户发布的测试版(beta)。而CodeSite更趋向于alpha。EEL并不给异常以任何的修正。如果需要,你应该自已来修正它。永远不要期望EEL会让你的产品变得稳定。EEL所做的,只是在出错时,友好地告诉你的用户错误发生了,是否报告给作者。——当然,他也可以在不打断用户操作的情况下,“悄悄地”通告作者这些异常的发生。这些异常和错误的修复是你的工作,而不是EEL的。你可以给TApplication.HandleException一个处理函数,并在处理函数中用CodeSite来发消息。这样,这就基本上得到了一个比EEL功能更强大的异常处理调试工具。事实上,EEL也使用该处理句柄来截获错误消息。但是,EEL通过一个自己的对象TEurekaThread提供了对多线程中异常进行检测的方法。因此,在某些类型的异常截获上,EEL会可能比CodeSite的方式来得有效。但这不是Raize与Eureka之间的较量,而是不同的解决方案和目标的差异。* 作为一个提示: CodeSite没有直接提供邮件方式的消息发送机制,你可以使用CodeSite的TCP接口,并通过定制数据类型的方式来发送邮件。如果你想现在就开如做这件事,建议你看看Raize上的一个示例:CodeSite TCP Direct Interface Unit。你可以在这儿下载它的源码:http://www.raize.com/DevTools/CodeSite/Utils/CSTcpDirectIntf.zip(四) Eureka Exception Log的使用方法EEL的使用比较简单(这也是我放弃EM的一个理由)。EEL安装安装后就会集成在Delphi IDE的菜单Project\Exception Log Options中。点开这个菜单,我们可以看到如下图所示界面,其中:? Exceptions : 设定忽略的异常信息列表;? DLL : 设定HOST所调用的需要检测异常的DLL项目;? E-Mail : 设置E-Mail通知的发送方式;? LogFile : 设置记录文件的生成方式;? Messages : 设置出错时从GUI/控制台发出消息的格式和语言;? Advanced : 设置检测异常时具体的处理方式和参数设定;? Errors : 显示本地错误记录和历史记录;设定完上述参数后,你需要保证“Active the ‘Exception Log’”被选中,这样才能将EEL结合到你的应用程序中去。还有两点是必须要注意却又容易忘记的:? 打开Project\Options\Compiler\Debug information选项? 将Project\Options\Linker\Map file选项设置成”Detailed" OK。一切搞定,现在你就可以编译项目并交付Beta了。* EEL已经缺省为你设置了这两项,但如果你编译运行时仍然存在问题,建议你看看这两个选择项。下面提供一个测试实例:1. 在Delphi中新建一个Application2. 加一个按钮,在onclick中写如下一行代码:ShowMessage(IntToStr(StrToInt('')));3. 在Project\Exception Log Options中打开EEL4. 设置Active the ‘Exception Log’为选中5. 打开Project\Options\Compiler\Debug information选项6. 将Project\Options\Linker\Map file选项设置成”Detailed"7. 编译运行现在你只需要点一下按钮,就明白会发生什么事了。:)你可以再打开Project\Options\Compiler\Use Debug DCUs选项,重新编译运行一下你的项目,你会发现报告信息的不同的。(五) 存在的问题ELL很小巧,功能也很单一,因此,它基本不存在什么大的问题。但还是有一些小的瑕疵。比如:? 对一个项目设置了Messages后无法保存到下一个项目中使用? 消息发送的形式不够丰富,应借鉴CodeSite的处理形式或者提供相应的接口(六) 其它EEL提供的错误信息会给你的维护工作带来极大的帮助。它甚至会准确地定位到错误行,如同在Delphi IDE内部调试一样的准确。EEL在你的程序中加入ExceptionLog.dcu单元,从而获得在程序的全局地处理异常的能力。但是,如果你使用try .. except .. end语句来封装了你的异常,则EEL什么也得不到。请记住EEL只能利用Handle Exception句柄来处理你忘记处理的那些异常,而不是你已经处理过的。这也是EEL的一个缺陷,如果它能够象Delphi IDE的Tools\ Debugger Options\Language Exceptions选项中的”Stop on Delphi Exception”那样截获到应用程序的任意异常,可能会更有价值。EEL在ExceptionLog.dcu单元提供一个全局的ExceptionHandle对象和一些全局变量,使你可以在应用程序中自由地控制EEL的全部,包括你能够在Exception Log Options对话框中看到的所有内容。关于这一点,请参考EEL的随机手册中的“Other”部分。EEL将你的配置保存在“*.dof” 文件(这里的“*”是项目文件名)中的[Exception Log]节里,这里也包含Messages的全部设置。你可以将该节保存成一个缺省配置,用来修改新工程.dof文件中的相应节的,以弥补EEL” 对一个项目设置了Messages后无法保存到下一个项目中使用”的缺陷。此外,你也可以在自己的应用程序中通过给ExceptionLog.RealMsgs[]数组赋值,从而实时地修改Messages的显示信息。EEL是不提供源程序的。因此,如果新版的EM出现,我建议重新评价EEL和EM的功能。此外,我甚至建议你使用CodeSite来替代一些EEL的工作。——如果你有信心处理好TCodeSite的每一个细节的话。——EEL是给懒人用的放大镜,而CodeSite是给那种有足够时间来应付代码和数据的程序员的哈勃天文望远镜。 关于报表的问题,急需帮助!! 简单问题 delphi和vfp相比,有什幺优点? 如何删除Query中的记录! 到底是哪儿出了问题? 哪里有关于Delphi和Oracle数据库程序设计的资料? 关于针式打印机的问题 数据处理问题???? VB中的变量类型Long是不是就是Delphi中的Interger?VB中的变量类型Integer是不是就是Delphi中的shortint? 关于经验的问题? 请问可否对ADOQuery里的dataset进行二次查询,结果人保存在这个dataset里呢? 请大家讨论在c/s结构里面,客户端,和应用服务器端各自的业务逻辑如何设计,
内存检测工具:MemProof,随便去个网站上找,使用方法更简单。
或者BoundChecker,这个检测就严格了一些,我不是很喜欢。
声 明
一、 关于在Internet网上转发本文件的声明
本文件的撰写目的是出自作者所在公司(河南省豫能信息技术有限公司)的工作需要。作者在Internet上公开本文纯属个人行为。任何个人或者机构可以在Internet上自由的转发和引用本文。但转发过程中必须保证本文的完整性,不得进行任何的修改。
作者允许任何个人或者机构在本文的转发过程中附带其它的文件来描述、补充或者评价本文。但不得在本文的原文中修改。
本文不做任何加密和权限设置,以方便读者的转发和转阅。
本文全文及其它个人或者机构补充的文档压缩在同一.zip包裹中发布。
二、 关于在传统媒体上刊载、使用、引用本文件的声明
禁止在未经本人书面(含电子邮件)许可的情况下在传统媒体上刊载、使用、引用本文件的部分或全部内容。
如果确需刊载、使用、引用本文件,请用Mail与本人联系。本人联系Mail:[email protected]或[email protected]。
三、 关于本文件可能携带的其它个人或机构的文档的声明
凡在本文件的压缩包中添加的文档均可自由地在Internet网上转发。——“加入本文件的压缩包”将被视为许可本项声明条款的行为。
其它文档如果有不同的声明,请在相应文档中另附。
豫能信息技术有限公司开发部
测试、调试软件软件使用评测计划
(评测报告)
为了在公司的软件开发过程中实施质量检测,保障产品质量,提高后期维护和整改的力度,特提出本使用评测计划。
在本评测报告中不详细描述评测的方法,仅描述结果和评测中的建议。
一、 评测对象
在收集的各种代码测试、调试软件中,我筛选了四种软件作为评测对象,开发人员可以根据工程大小、实施测试的阶段选用不同的软件。这三种软件分别是:
1. GpProfile Version 1.33
2. CodeSite Version 2.0
3. Eureka Exception Log Version 3.1
4. AQTime Version 2.0
5. BoundsCheck Version 6.5
所选评测对象仅适用于开发人员在开发和维护进行的过程中对软件产品进行测试和调试,不适用于公司测试组的工作。
二、 评测报告一:GpProfile Version 1.33
(一) GpProfile的简介
GpProfile是一个开放源码的Delphi项目。它是由Primoz Gabrijelcic主持开发实施的。他所主持开发的项目还包括:
? TP Lex/Yacc 3.0 : 一个语言生成和语法检测工具
? GpHugeFile : 一个用来处理超大文件的Delphi组件
等。
GpProfile被大量的工具软件厂商应用在自已的产品开发中。如: Delphi-BOX的INF-Tool,Lars Akerman Software的CGI Expert,Femte Gear Internet Software的Pixel Pack和Duncan Amplification的Disk2Disk等都在开发过程中使用了GpProfile。
(二) GpProfile的特点
GpProfile的特点包括:
? 开放源码
? 在分析的全过程实现了项目源代码组合
? 能分析DLL,EXE和.DPK包裹文件等多种项目类型
? 支持多线程
? 支持条件编译标志设置两种方法分析标签设置方法
? 能清晰地显示函数/类之间的调用结构关系
? 支持测试报告的导出,可形成标准的LOG文件格式,提供第三方接口
? 可以在应用程序中控制GpProfile的分析,提供API
(三) GpProfile的适用对象和适用阶段分析
GpProfile仅适用于在Delphi开发过程中用来测试类/函数的执行效率,简单地说,它是一个效率分析工具。
GpProfile分析地全过程是基于程序的调试代码的,同时,它要求你具有项目的源代码。这意味着,你不能用它来分析没有源代码的第三方控件和DLL/ActiveX对象。
由于GpProfile实际上不对源代码的质量做任何地评估,而只是简单的引用。此外,它需要你的编译程序有调试信息并至少完整地运行过一次。因此,GGProfile适合于你发布产品的测试版本,或者交付用户进行测试的情况。
GpProfile不对程序的错误做任何的控制。你必须当心你的程序崩溃而导致GpProfile什么也分析不到。因为GpProfile需要基于你的应用正常退出后生成的记录文件来分析。
GpProfile通过.DCU提供能在你的程序内部调用的API,使你可以在应用程序的任何位置停止并驱动GpProfile展开分析。这使应用程序在意外中止之间至少有一次机会保存记录。
(四) GpProfile的使用方法
GpProfile可能是我在测试中见过使用方法最简单的一套性能分析工具。下面简要介始它的使用方法:
1. 启动
启动GpProfile至少有两种方法:
? 从Delphi IDE Tools中启动
? 直接启动
2. 打开测试项目
接下来,你可以打开一个测试项目。对于GpProfile来说,你只能打开.DPR或者.DPK文件来做测试项目。
如果你从Delphi IDE从启动GpProfile,则IDE中的当前项目将直接成为GpProfile的测试项目。
3. 选定测试对象
在GpProfile的主窗体中,有Instrumentation页,在该页中,你可以见到在测试项目中的全部的函数和类的Procedure/Function接口。这些是你可选的测试对象。
你可以选择类/函数的复杂组合作为测试对象。
完成选择之后,你需要点一下 按钮,将选择对象组合到你的源代码中。当然,如果你已经设置好源代码的编译开关,你也可以直接按 按钮来一步完成组合->编译->运行应用程序这全部的工作。
如果你在Delphi中打开了组合的过程/函数所在的单元,则你会在Delphi IDE中收到一个要求重新载入源程序的消息。此时,你应该选“确定”。
4. 编译应用程序
GpProfile不需要你对应用程序的编译选项做任何的特殊配置。但你必而编译一个新的应用程序来将GpProfile的代码组合到你的目标程序中。
当然,你也可以在Delphi IDE环境中选“运行”,而不必直接编译目标文件。
5. 运行应用程序
接下来,你需要运行应用程序。在GpProfile中,这一步最至关重要,也最容易出错。
在较简单的情况下,运行程序直到应用程序结束,被组合应用程序中组合进的GpProfile的代码将会自动在应用程序所在目录生成*.prf文件,这就是分析用的记录文件。
但某些程序下,如果你的应用程序不是正常中止的,可能你无法有效地得到.prf文件。这时,你可能要在你的源代码中加入一些针对于GpProfile的控制代码。关于这一部分,你可以在GpProfile的Help中查看关于它的API的说明。
此外,一个实例是关于ISAPI的,在Delphi IDE中运行并中止ISAPI DLL时,并不会生成报告。这可能与IIS的线程处理机制有关。但你可以不使用调试模式,并通过IIS服务管理器来中止ISAPI,这样,你就可以得到检测报告了。
6. 查看测试报告
如果在运行应用程序时,你GpProfile开着。那么,你的应用程序结束时,GpProfile会自动打开测试报告。否则,你应该在GpProfile的主界面中,选择Profile\Open菜单,到应用程序所在目录中去打开测试报告。
(五) 存在的问题
OH...好象问题不多,哈哈~~~~~~
? 不要指望它能给你调试程序带来任何的帮助。
? 不要指望你能通过它来给没有源代码的项目做任何分析。
? 有没有人能告诉我它的“Layout”菜单有什么用。^-^
? Layout Manager的对话框中有一个小BUG。
? 在启动或中止替换图片时可能会发生一个错误,此时你需要更换新的Comctl32。
? 出于安装程序的问题,在Win95/98中,可能无法将GpProfile安装到Delphi IDE中,你可以运行GPPROF /REGISTER命令来手工安装它。
? 不能处理对{$INCLUDE}包含文件中的过程的组合。
? 对Remote Profile分析的处理不是太理想
(六) 其它
千万别用ProDelphi。那将给你带来一场灾难。它会将你的源代码改得一塌糊涂,至少我用过的ProDelphi Version 9.4是这样。——而GpProfile中提供了很好的Remove Instrumentation功能。
(一) CodeSite的简介
CodeSite实在是一个不可多得的调试辅助工具。——OH,首先请记住的,它是一个调试辅助工具,而GpProfile是一个代码性能分析工具。
CodeSite最大的作用是将你的应用程序中的运行情况通过CodeViewer显示出来。他可以实时地反映这些信息。同时,他也能将应用程序发生异常时的系统状况真实地反映出来,包括Memory Buffer、Strack、Class Object以及VCL等等。此外,你还可以定制发向CodeViewer的数据的格式(当然,你也同时要为这种数据格式在CodeViewer中书写一个接收器插件)。
CodeSite Version 2.0获得了2000年度Delphi Informant读者选择的最佳调试工具奖。它是一个商业级控件,是著名的Raize公司的代表作品。Raize还出品了Raize Component Pack,估记已是无人不知了。
(二) CodeSite的特点
CodeSite通过它自己的组件将代码完全集成到Delphi所编译的应用程序的内部。事实上,CodeSite更象是提供了两个非可视控件来生成程序运行记录。正如Hubdog所说,它更象是Delphi EventLog的一个扩展版本。
* Hubdog:国内一个很不错的Delphi程序员。他所整理的《Delphi之未经证实的葵花宝典2.5》可以说是我编程的备查手册,不过好象已经停止更新了。
但CodeSite具有它自身独有的特点:
? 有一个功能强大的、可在消息源中定制路由的消息转发器。
? 消息中对消息路由的控制采用字符串,容易实现用户配置。
? 强大的第三方插件和工具支持。
? 可定制的消息格式和完善的接口。
? 消息控制可以完美地嵌入Delphi应用程序内部。
? 支持远程消息发送,支持TCP/UDP协议。
? 商业级地产品后期支持。
(三) CodeSite的适用对象和适用阶段分析
CodeSite完全不适合一个没有源程序的应用程序。
CodeSite并不是一个适合在调试期使用的产品。它不产生调试代码,也不对程序的运行做任何的控制和分析。
CodeSite适合于在产品分发的Beta版中使用。它不是一个理想的远程代码维护工具,但它是绝对一个是好的远程代码运行情况的Monitor。
CodeSite不能给你的的代码调试带来任何主动的建议,请自行分析它的数据和报告。CodeSite只是静态的提供程序运行期的各种程序内部对象的状态数据,分析是你自己的工作。
(四) CodeSite的使用方法
请参考Hobdog的《CodeSite Pro 2.0应用指南》。——这是一份精彩的手册,我想我对它的任何补充都是画蛇添足。
(五) 存在的问题
没有真正完美的东西。——于这一点,请相信我。
最大的问题是CodeSite缺乏分析报告。甚至,他连一些简单的统计(当然,更别说分析)工作都没有做。天啊,从一大堆数据中去逐行分析一个程序流程与看《完全自杀手册》难道有什么区别吗?有一点值得庆幸的是,它还是在CodeSite中加入了一个Filter工具。——写到这儿,Aiming偷偷地抹了一把冷汗。^-^
问题之二来源于CodeSite Dispatcher(CodeSite专用的消息分发器)。如果消息要发向的目标是一个局域网用户,CodeSite通过TCP/IP协议只能发向一个Internet用户。那么,如何能接收到这个消息呢?解决的方法至少有两种,一个是在局域网的对外的服务器上再装一个CodeSite Dispatcher,由它来转发给局域网用户;另一种是在CodeSite内部通过专用格式的TCP/UDP报文头来要求网关向内部网转发。问题是,这两种方法CodeSite一个都没有实现。
其三,CodeSite并不通告运行应用程序的用户它在后台发出消息。因此,在一些私人数据敏感的软件中加入CodeSite时,请你自行向用户提示。这可能是你必须要做的一件事。——在文档中、授权中,或者弹出一个消息框来告诉用户:OH,Mr. or Mrs. I’ll send some message to my father. Can I do this? Yes or NO?
其四,请考虑在你的源码中加入CodeSite的代码的时候加入条件编译语句。这样可以你使你在正式发布产品时节省很大的力气。不过,说实在的,我总是近于顽固地认为这是Raize来做的事情。
(六) 其它
如果你不是极端完美主意者,那么,强烈建议你在发布Beta时选用CodeSite。并且,同时建议从你的应用中彻底地清除掉那些用于写LogFile或者向事件查看器发消息的代码。
Aiming的代码库pubUnit.pas中的Funtion SendMessageLog()可以删除掉了.
(一) Eureka Exception Log的简介
在我见到Eureka Exception Log之前,ExceptionalMagic一直是一个非常不错的替代品。但当我很偶然地发现Eureka Exception Log之后,我就决定放弃ExceptionalMagic了。
这里顺便先说说ExceptionalMagic(EM)。EM是Dimus UNLEASHED发布的一个Delphi异常报告工具(在这一点上是与Eureka Exception Log一致的),EM发布的正式版本带有全套源码,售价也仅有50$。同时,它能够在提示异常时显示堆栈、寄存器和定位源代码行(含VCL/RTL),并显示用户定制错误消息对话框或者写入Log文件。可以说是很不错的选择。但影响我此次选择的最重要原因是EM几乎是停止维护的产品。——自2000.4.20发布1.51之后,EM几乎就不再出新版本。2001.10.31日EM又发布了一个Ver1.6 Beta给注册用户测试,但接下来一点消息也没有了。因此,我只好选择Eureka作为我的评测对象,因为Eureka Exception Log的功能实在比EM易用得多。
* 我很少会在两个带与不带源码的产品中选择后者,但Eureka占胜了我的习惯。由此我想,在软件行业中,服务是第一位的。——这也算做题外话吧。
Eureka Exception Log(EEL)出自Eureka,该公司似乎只开发这个产品。EEL的最新版本是3.1,支持Delphi 6,售价是28$/78$。
(二) Eureka Exception Log的特点
EEL和EM是同一类产品,它们都是在程序发生异常时截断Delphi的异常处理流程,然后给用户/开发人员最后一次处理异常的机会。通常情况下,EEL和EM都建议你将错误显示给用户或者写入Log文件。不同的是,EEL提供了在出错时发送Mail的功能。
EEL的特点主要表现在:
? 很完美地与Delphi IDE的组合在一起,异常处理过程几乎不需要编码。
? 目标代码增大的情况不严重(仅增大25K)。
? 多种错误显示和提交方式,选项多而实用。
? 错误提示可以使用你指定的任何语言,可定制性极高。
? 支持包、DLL和多线程应用。
? 提供面向CGI应用的接口,可以将错误显示成HTML页。
(三) Eureka Exception Log的适用对象和适用阶段分析
当然,EEL也只适合于有程序源代码的情况。不过,它并不要求你所使用的控件也有源程序。——只要第三方控件的.DCU带有调试信息,则EEL可以对发生的异常定位到源代码行。否则,它只会告诉你在这个单元中发生了错误。
EEL和CodeSite一样,都用于在一个远端程序中收集程序的运行状态信息。不同的时,EEL的仅限于收集异常信息,并且它显示信息的对象是同时面向软件用户和开发人员的。而CodeSite的信息比ELL全面庞杂,仅提供给开发人员使用。
EEL可以用于面向开发人员的测试版(alpha),也可以用于面向用户发布的测试版(beta)。而CodeSite更趋向于alpha。
EEL并不给异常以任何的修正。如果需要,你应该自已来修正它。永远不要期望EEL会让你的产品变得稳定。EEL所做的,只是在出错时,友好地告诉你的用户错误发生了,是否报告给作者。——当然,他也可以在不打断用户操作的情况下,“悄悄地”通告作者这些异常的发生。这些异常和错误的修复是你的工作,而不是EEL的。
你可以给TApplication.HandleException一个处理函数,并在处理函数中用CodeSite来发消息。这样,这就基本上得到了一个比EEL功能更强大的异常处理调试工具。事实上,EEL也使用该处理句柄来截获错误消息。但是,EEL通过一个自己的对象TEurekaThread提供了对多线程中异常进行检测的方法。因此,在某些类型的异常截获上,EEL会可能比CodeSite的方式来得有效。但这不是Raize与Eureka之间的较量,而是不同的解决方案和目标的差异。
* 作为一个提示: CodeSite没有直接提供邮件方式的消息发送机制,你可以使用CodeSite的TCP接口,并通过定制数据类型的方式来发送邮件。如果你想现在就开如做这件事,建议你看看Raize上的一个示例:CodeSite TCP Direct Interface Unit。你可以在这儿下载它的源码:
http://www.raize.com/DevTools/CodeSite/Utils/CSTcpDirectIntf.zip
(四) Eureka Exception Log的使用方法
EEL的使用比较简单(这也是我放弃EM的一个理由)。EEL安装安装后就会集成在Delphi IDE的菜单Project\Exception Log Options中。
点开这个菜单,我们可以看到如下图所示界面,其中:
? Exceptions : 设定忽略的异常信息列表;
? DLL : 设定HOST所调用的需要检测异常的DLL项目;
? E-Mail : 设置E-Mail通知的发送方式;
? LogFile : 设置记录文件的生成方式;
? Messages : 设置出错时从GUI/控制台发出消息的格式和语言;
? Advanced : 设置检测异常时具体的处理方式和参数设定;
? Errors : 显示本地错误记录和历史记录;
设定完上述参数后,你需要保证“Active the ‘Exception Log’”被选中,这样才能将EEL结合到你的应用程序中去。
还有两点是必须要注意却又容易忘记的:
? 打开Project\Options\Compiler\Debug information选项
? 将Project\Options\Linker\Map file选项设置成”Detailed"
OK。一切搞定,现在你就可以编译项目并交付Beta了。
* EEL已经缺省为你设置了这两项,但如果你编译运行时仍然存在问题,建议你看看这两个选择项。
下面提供一个测试实例:
1. 在Delphi中新建一个Application
2. 加一个按钮,在onclick中写如下一行代码:
ShowMessage(IntToStr(StrToInt('')));
3. 在Project\Exception Log Options中打开EEL
4. 设置Active the ‘Exception Log’为选中
5. 打开Project\Options\Compiler\Debug information选项
6. 将Project\Options\Linker\Map file选项设置成”Detailed"
7. 编译运行
现在你只需要点一下按钮,就明白会发生什么事了。:)
你可以再打开Project\Options\Compiler\Use Debug DCUs选项,重新编译运行一下你的项目,你会发现报告信息的不同的。
(五) 存在的问题
ELL很小巧,功能也很单一,因此,它基本不存在什么大的问题。但还是有一些小的瑕疵。比如:
? 对一个项目设置了Messages后无法保存到下一个项目中使用
? 消息发送的形式不够丰富,应借鉴CodeSite的处理形式或者提供相应的接口
(六) 其它
EEL提供的错误信息会给你的维护工作带来极大的帮助。它甚至会准确地定位到错误行,如同在Delphi IDE内部调试一样的准确。
EEL在你的程序中加入ExceptionLog.dcu单元,从而获得在程序的全局地处理异常的能力。但是,如果你使用try .. except .. end语句来封装了你的异常,则EEL什么也得不到。请记住EEL只能利用Handle Exception句柄来处理你忘记处理的那些异常,而不是你已经处理过的。这也是EEL的一个缺陷,如果它能够象Delphi IDE的Tools\ Debugger Options\Language Exceptions选项中的”Stop on Delphi Exception”那样截获到应用程序的任意异常,可能会更有价值。
EEL在ExceptionLog.dcu单元提供一个全局的ExceptionHandle对象和一些全局变量,使你可以在应用程序中自由地控制EEL的全部,包括你能够在Exception Log Options对话框中看到的所有内容。关于这一点,请参考EEL的随机手册中的“Other”部分。
EEL将你的配置保存在“*.dof” 文件(这里的“*”是项目文件名)中的[Exception Log]节里,这里也包含Messages的全部设置。你可以将该节保存成一个缺省配置,用来修改新工程.dof文件中的相应节的,以弥补EEL” 对一个项目设置了Messages后无法保存到下一个项目中使用”的缺陷。此外,你也可以在自己的应用程序中通过给ExceptionLog.RealMsgs[]数组赋值,从而实时地修改Messages的显示信息。
EEL是不提供源程序的。因此,如果新版的EM出现,我建议重新评价EEL和EM的功能。此外,我甚至建议你使用CodeSite来替代一些EEL的工作。——如果你有信心处理好TCodeSite的每一个细节的话。——EEL是给懒人用的放大镜,而CodeSite是给那种有足够时间来应付代码和数据的程序员的哈勃天文望远镜。