仅基于失败运行的错误定位

合集下载

LCS定位的使用、常见错误说明及处理办法

LCS定位的使用、常见错误说明及处理办法

LCS定位的使用、常见错误说明及处理办法地市移动平台客户(版本:V1.0)2011年9月9日目录LCS定位常见错误说明及处理办法 (1)概述 (3)1.范围 (3)2.综述 (3)LCS定位产品使用 (4)3.产品受理 (4)4.车务通平台操作 (4)4.1修改成员信息 (4)4.2LCS定位 (5)4.3LCS相关功能 (5)常见故障分析及处理 (6)5.故障分析及处理 (6)5.1故障一 (6)5.2故障二 (6)5.3故障三 (7)5.4故障四 (7)图表目录图1:车辆信息修改对话框0-1 4图2:未修改类型,提示无网络 1 6 图3:白名单鉴权失败0-1 6概述1. 范围本文档面向福建移动地市车务通产品经理及LCS定位业务推广人员。

本文档仅描述车务通平台对LCS定位的使用,对BOSS开户,套餐启用,短信二次确认等产品受理不做说明。

2. 综述自从福建车务通系统开通LCS定位以来,陆续接到各地市在业务推广中遇到的故障投诉,将各类投诉后总结归类后,发现故障类型可分为四类,现编写此文档将LCS 的使用以及此四类故障现象、故障判断、故障解决做出说明。

LCS定位产品使用3. 产品受理LCS个人定位安装移动既定流程受理产品,开相关套餐,车务通平台上自动同步相关集团和相关相关成员基本信息;被定位人员发送短信二次确认,白名单受理成功。

4. 车务通平台操作4.1 修改成员信息登录车务通平台管理分析系统,登录地址为::81/stargps/login.aspx,输入集团编号、用户名、密码(注:如果用户名是车务通系统中添加的,非M2M同步的集团,则集团编号为添加该用户的集团编号,用户名密码输入添加的用户名密码)。

车辆管理页面,查找到需要修改的车辆(LCS定位目前展现形式为车辆,可通过卡号搜索到车辆所在区域,选择该区域后,如车辆太多,可通过Ctrl+F查找网页上匹配的车牌),选择该车辆后点击页面上方修改信息,弹出如下对话框:图1:车辆信息修改对话框0-1根据弹出的对话框,修改相应的车辆信息,其中带*号的为必填项,红色框起来的选项修改为“LCS个人定位”,点击页面上方“确定”按钮,修改成功。

kinco步科宏编译失败处理方式举例

kinco步科宏编译失败处理方式举例

kinco步科宏编译失败处理方式举例1.引言1.1 概述在引言部分的概述中,我们将介绍关于"kinco步科宏编译失败处理方式举例"这个主题的背景信息和重要概念。

编译失败是在软件开发过程中常见的问题之一,它可能会导致程序无法正确运行或产生错误。

特别是在使用kinco步科宏进行编译时,程序员经常面临编译失败的情况。

为了解决这些问题,我们需要了解导致编译失败的可能原因,并学习相应的处理方式。

在本文中,我们将首先介绍编译失败的原因,包括语法错误、链接错误以及其他常见错误。

然后,我们将通过举例来展示如何处理编译失败的情况,着重介绍kinco步科宏编译失败的处理方式。

最后,我们将总结这些处理方式,并提供一些建议,以帮助读者在实践中更好地处理kinco步科宏编译失败的情况。

通过阅读本文,读者将能够更好地理解编译失败的原因,掌握处理编译失败的方法,并且能够在使用kinco步科宏进行编译时更加熟练地应对可能出现的编译失败情况。

1.2文章结构文章结构部分是文章中非常重要的一个环节,它能够帮助读者更好地理解和掌握文章的内容。

通过清晰的结构,读者可以更容易地找到所需的信息,并且理解文章的逻辑关系。

本文的文章结构主要分为以下几个部分:1. 引言:本部分主要对文章的背景和目的进行介绍,让读者对kinco步科宏编译失败的问题有一个初步的了解。

在引言部分中,我们将概述kinco步科宏编译失败的现象以及其对应的困扰。

同时,我们还将介绍本文的结构,以引导读者更好地阅读和理解接下来的内容。

2. 正文:本部分是文章的重点部分,我们将具体分析kinco步科宏编译失败的原因,并举例说明处理方式。

在2.1节中,我们将从根本原因、环境配置、代码错误等方面探讨编译失败的原因。

通过对这些原因的分析,我们可以更深入地了解编译失败的本质和来源。

在2.2节中,我们将通过一些实例来展示不同情况下的编译失败处理方式。

这些实例将包括常见的错误提示、解决步骤和注意事项等。

排查程序错误和崩溃的常见方法

排查程序错误和崩溃的常见方法

排查程序错误和崩溃的常见方法在软件开发过程中,程序错误和崩溃是非常常见的问题。

这些问题不仅会影响用户的体验,还可能导致数据丢失和系统不稳定。

因此,及时排查和解决这些问题是非常重要的。

本文将介绍一些常见的方法来排查程序错误和崩溃。

1. 调试工具的使用调试工具是排查程序错误的利器。

其中,最常用的工具是调试器。

调试器可以让开发人员逐步执行程序,并观察程序的运行状态。

当程序出现错误或崩溃时,调试器可以提供相关的错误信息和堆栈跟踪,帮助开发人员定位问题所在。

常见的调试器有GDB、Xcode和Visual Studio等。

除了调试器,还有一些其他的调试工具可以帮助排查程序错误。

例如,内存检测工具可以检测内存泄漏和越界访问等问题;性能分析工具可以帮助发现程序的性能瓶颈等。

根据具体的问题,选择合适的调试工具可以提高排查效率。

2. 日志记录和错误报告日志记录是排查程序错误的重要手段之一。

通过在程序中添加日志输出语句,可以记录程序的运行过程和关键信息。

当程序出现错误或崩溃时,可以通过查看日志来获取相关的调试信息。

可以记录程序的输入、输出、运行时状态等信息,以便更好地定位问题。

除了日志记录,错误报告也是一种重要的排查程序错误的方法。

当程序出现错误或崩溃时,可以向开发团队发送错误报告,包括错误信息、堆栈跟踪和运行环境等。

开发团队可以通过错误报告来分析和解决问题。

为了保护用户隐私,错误报告中不应包含敏感信息。

3. 单元测试和集成测试单元测试和集成测试是预防程序错误的重要手段。

单元测试是对程序中最小的可测试单元进行测试,例如函数或方法。

通过编写单元测试用例,可以验证程序的各个功能是否正常工作。

集成测试是对程序的不同模块进行测试,验证它们之间的交互是否正确。

通过进行单元测试和集成测试,可以及早发现和修复程序中的错误。

测试用例应该覆盖各种可能的输入和边界情况,以确保程序的正确性和稳定性。

自动化测试工具可以帮助开发人员更方便地编写和运行测试用例。

操作者框架(Actor Framework)下几种典型的错误处理方法总结

操作者框架(Actor Framework)下几种典型的错误处理方法总结

操作者框架(Actor Framework)下几种典型的错误处理方法总结主要软件: LabVIEW Development Systems>>LabVIEW Professional Development System主要软件版本: 2013主要软件修正版本: N/A次要软件: LabVIEW Development Systems>>LabVIEW Professional Development System问题:从LabVIEW 2012开始正式推出操作者框架(Actor Framework),操作者框架一经推出,就在处理异步多进程调用及通信方面展现出无比的优势,但操作者框架在实际使用时还有许多问题需要注意,譬如,如果程序运行过程中某个进程出现了错误,那整个程序作为一个整体,该如何应对?解答:错误处理在软件工程中是一个非常庞杂的问题,本文将主要从以下几个方面展开。

1、操作者框架中的错误处理vi:操作者框架的设计思想其实并不是什么新的东西,其实就是基于LVOOP对LabVIEW中传统的队列状态机进行的封装,从面向过程的角度看,传统的LabVIEW队列状态机程序框图可能如下:操作者框架基于LVOOP对上述程序框图进行封装后可以得到如下的程序框图,基本的处理操作被Do.vi取代,错误处理被Handle Error.vi接管,此外,退出while循环后整个进程还有个Stop.vi。

注意到这三个vi都是可用于重写的,通过重写这几个vi,可以很轻易地创建出一个实现特定任务的新进程。

打开Handle Error.vi可以看到操作者框架提供的默认错误处理vi行为是比较简单的,如下图:如果基于操作者框架编写的进程具有自己的错误处理行为,可以新建自己的Handle Error.vi重写父类vi,并在自己的Handle Error.vi中填入对应的代码。

我们以出现错误代码1时不停止进程为例,对应的子类Handle Error.vi代码可以这样编写:2、操作者框架中树形拓扑结构下的错误处理方案一旦某个进程出现了运行错误,该进程可以首选自己来处理这个错误,但是绝大多数时候,该进程还需要将此错误信息发送到整个程序的其他进程中(譬如让高层进程知晓错误并采取必要的措施)。

AI在软件开发中的智能错误定位与修复

AI在软件开发中的智能错误定位与修复

AI在软件开发中的智能错误定位与修复随着人工智能(AI)技术的迅速发展,它在软件开发领域的应用也越来越广泛。

其中一个重要的应用是在软件开发过程中的智能错误定位与修复。

本文将讨论AI在这一领域的应用及其优势。

一、AI在智能错误定位中的应用1. 数据驱动方法AI利用大数据和机器学习算法,对软件开发过程中的错误进行智能定位。

通过在大量的软件开发项目中收集错误数据,AI可以分析出常见的错误类型和出现的规律。

这些数据和规律可以帮助开发人员快速定位错误,并给出相应的解决方案。

2. 模糊测试技术AI利用模糊测试技术,对软件进行自动化测试,以寻找潜在的错误。

模糊测试通过在软件中注入随机或无效的输入,可以发现一些开发者没有预料到的错误情况。

AI可以对模糊测试结果进行分析和整理,提供有针对性的错误修复建议。

3. 异常检测和预测AI可以通过监控软件运行过程中的异常行为,快速检测和定位错误。

通过对软件运行数据的实时分析,AI可以预测可能出现的错误情况,并采取相应的措施进行修复。

这种异常检测和预测的能力大大提高了软件的稳定性和可靠性。

二、AI在智能错误修复中的应用1. 自动生成代码AI可以通过学习大量的代码样本,自动生成符合规范的代码片段。

在软件开发过程中,开发者常常需要编写大量的重复性代码,容易出现错误。

AI的自动生成代码能力可以提高开发效率,并减少潜在的错误。

2. 自动化代码注释AI可以通过对代码的语义分析,自动为代码添加注释。

良好的代码注释可以提高代码的可读性和可维护性,并减少代码错误。

AI的自动化代码注释功能可以帮助开发者节省时间,并提高代码质量。

3. 错误修复建议AI可以通过学习大量的错误修复经验和规律,为开发者提供针对性的错误修复建议。

当开发者遇到错误时,AI可以分析错误的类型和原因,并给出相应的解决方案和代码修改建议。

这大大提高了开发者的工作效率和错误修复的准确性。

三、AI在软件开发中的优势1. 高效性:AI可以快速定位和修复软件中的错误,大大提高了软件开发的效率。

调试过程的问题及解决方法

调试过程的问题及解决方法

调试过程的问题及解决方法调试是软件开发过程中不可或缺的一环,它用于查找和修复代码中的错误。

然而,在调试过程中常常会遇到各种问题,下面将讨论一些常见的调试问题及其解决方法。

1. 编译错误:编译错误是最常见的问题之一。

当编译器无法正确解析代码时,会产生编译错误。

解决方法包括检查语法错误、缺少的依赖项以及命名冲突等。

编译器通常会提供错误消息和行号,有助于定位问题所在。

2. 运行时错误:运行时错误是在程序执行过程中发生的错误。

常见的运行时错误包括空指针引用、数组越界和除以零等。

解决方法包括使用调试器逐行跟踪程序执行过程、检查变量的值和程序流程等。

调试器可以帮助开发人员定位错误发生的位置和原因。

3. 逻辑错误:逻辑错误是代码中的错误逻辑或算法导致程序运行不正确的问题。

解决方法包括仔细检查代码逻辑、使用调试器观察变量值和程序流程、添加日志输出等。

通过仔细分析代码,可以找到导致逻辑错误的原因,并进行相应的修复。

4. 环境配置问题:有时调试过程中遇到的问题可能与环境配置有关。

例如,缺少必要的库文件或配置不正确。

解决方法包括仔细检查环境配置、确保所需的库文件已正确安装和链接等。

5. 多线程问题:多线程编程中的问题可能难以调试,因为线程之间的交互和竞态条件可能导致不确定的结果。

解决方法包括使用调试器观察线程的执行和相互作用、添加同步机制以避免竞态条件等。

6. 调试工具问题:有时候调试工具本身可能出现问题,例如崩溃或无法正常启动。

解决方法包括重新安装或升级调试工具、查找并修复相关错误报告等。

总结来说,在调试过程中遇到问题时,需要耐心和仔细地分析代码和错误信息,使用适当的调试技术和工具来定位和解决问题。

同时,编写可调试性强的代码和添加适当的日志输出也是预防和解决调试问题的有效手段。

Delphi Access Violation错误的分析

Delphi Access Violation错误的分析Delphi常见的运行期Access Violation错误有哪些?如何防止?任何软件开发都会遇到这样的情况:你写好程序并测试,然后到处发送,结果用户告诉你它失败了。

你可能考虑用编译指令{$D}编译你的程序——Delphi可以建立一个有助于定位Access Violation错误的源代码的镜像文件。

工程选项对话框(Project|Options|Linker & Compiler)让你指定你所需要的一切。

对于单元文件,debug信息和单元的对象代码一起记录在unit文件里了。

编译使用这个单元的程序时,debug信息会增加单元文件的大小而且会增加额外的内存开销,但是它不会影响最终可执行文件的大小和运行速度。

包含debug信息和镜像文件(Project|Options|Linker)选项的产品只有在{$D+} 编译指令下才会完成行信息。

Access violation通常只在程序的某一个方面表现出来。

当问题第一次出现时,考虑一下用户进行了什么操作是很重要的,然后从这里寻找突破口。

从用户的角度来看,你的程序中止了他们的工作,由他们来告诉你出现的问题似乎让你延期解决这个问题了。

然而,与用户交流是你发现问题和改善程序的惟一有效方法。

现在你将可以知道在只给你冲突地址的情况下,如何轻松发现准确路径、源代码文件、发生Access violation错误的行:“Search - Find Error…”。

当一个运行期Access violation出现时,你的用户得到的错误信息类似于如下情况:Access violation at address <十六进制值> in module <应用程序名> Read of address <十六进制值>如果你的程序在Delphi IDE里包含debug信息编译,你可以定位到导致这个错误源代码这一行。

对程序进行错误处理的有效方法

对程序进行错误处理的有效方法程序错误处理是保证程序正确运行和避免程序崩溃的重要步骤。

通过合适的错误处理方法,程序能够在出现错误时及时发现问题并进行处理,提高程序的健壮性和可靠性。

下面介绍一些有效的程序错误处理方法。

1.异常处理异常处理是一种常见的错误处理方法,通过捕获程序执行期间可能出现的异常,防止程序崩溃并提供错误信息。

在程序中合适的位置使用try-catch语句块来捕获异常,并在catch块中处理异常情况,包括输出错误信息、记录错误日志、回滚事务等操作。

通过异常处理,可以避免异常错误向上传播,并且可以提供更加详细的错误信息进行排查和修复。

2.错误代码和错误信息在程序中使用错误代码和错误信息来表明程序的错误情况。

通过给每个可能的错误情况定义一个错误代码,并在程序中进行判断和处理,可以有效地分辨程序的错误种类,并采取相应的措施进行处理。

同时,使用错误信息来描述具体的错误细节,可以帮助开发者快速定位和修复错误。

3.输入验证和过滤输入验证和过滤是一种预防和处理错误的有效方法。

在程序中对所有输入进行必要的验证,包括数据的类型、范围和格式等。

通过验证和过滤,可以避免不合法的输入导致的错误,并及时反馈给用户合适的错误信息。

输入验证和过滤还可以防止恶意攻击和注入攻击等安全问题。

4.日志记录在程序中使用日志记录来对程序运行过程进行记录,包括错误信息、警告和调试信息等。

通过合适的日志记录级别设置,可以将错误信息记录下来,并在出现问题时进行排查和分析。

日志记录还可以提供程序运行过程的详细信息,对于定位和修复错误非常有帮助。

5.合理的重试机制当程序执行遇到错误时,合理的重试机制可以帮助程序自动恢复运行,并及时修复错误。

通过设置适当的重试次数和重试时间间隔,可以在短时间内解决一些由于临时问题导致的错误。

在重试过程中,可以记录重试次数和错误信息,以便后续分析和处理。

6.资源管理和释放在程序中正确管理和释放资源是避免错误的重要方法。

tarantula算法

tarantula算法
Tarantula算法是一种用于定位和修复软件中的错误的排错算法。

该算法基于程序中的覆盖率信息和失败信息,用于确定哪些代码单元(如语句、分支等)与错误相关。

Tarantula算法
将错误的相关性定义为代码单元失败的概率与代码单元失败的总概率之比,即Tarantula公式:
Suspicion_score = failed_test / total_failed * (passed_test /
total_passed - failed_test / total_failed)
其中,failed_test表示包含代码单元的失败测试数,total_failed 表示总失败测试数,passed_test表示包含代码单元的通过测试数,total_passed表示总通过测试数。

Tarantula算法根据概率分别计算每个被测代码单元的可疑度
得分,得分越高表示该代码单元与错误的相关性越大,需要优先进行检查和修复。

这样可以帮助开发人员快速定位代码错误,并减少调试时间。

Tarantula算法是基于频谱分析技术的一种软件错误定位算法,可以用于各种类型的软件,并用于提高开发效率和软件质量。

代码错误分析个人总结

代码错误分析个人总结引言在程序开发过程中,经常会遇到各种各样的错误。

代码错误使得程序无法正常运行,给开发者带来了很大的困扰。

错误分析是程序开发中非常重要的一环,通过分析错误的原因,可以找到问题的根源并进行修复。

在本文中,我将针对代码错误分析进行个人总结,并分享一些经验和技巧。

错误分类首先,我们需要了解代码错误的一些基本分类。

常见的代码错误分为三大类:语法错误、逻辑错误和运行时错误。

1. 语法错误语法错误是最常见的错误之一,发生在代码不符合语言的语法规范时。

这些错误通常可以通过编译器或解释器的错误提示来定位。

常见的语法错误包括缺失分号、拼写错误、括号不匹配等。

解决语法错误的方法是仔细检查错误提示,找出错误的位置,然后进行修复。

对于拼写错误,可以使用自动拼写检查工具进行纠正。

2. 逻辑错误逻辑错误指的是代码在逻辑上出现问题,导致程序无法正确运行。

逻辑错误通常不会被编译器或解释器检测出来,因为代码的语法是正确的。

对于逻辑错误,我们需要通过代码调试和逻辑分析来进行定位和修复。

解决逻辑错误的方法是通过打印调试信息来观察程序的执行过程和结果,从而找出逻辑问题的根源。

另外,对于复杂的逻辑错误,可以使用单元测试等方法进行验证。

3. 运行时错误运行时错误是代码在运行时发生的错误,通常是由于异常情况导致的。

常见的运行时错误包括空指针引用、数组越界、资源泄漏等。

解决运行时错误的方法是使用异常处理机制来捕获和处理异常。

通过使用try-catch语句块,可以捕获到可能抛出的异常,并进行相应的处理或修复。

错误分析和调试技巧在分析和调试代码错误时,我们需要掌握一些技巧和方法。

1. 打印调试信息打印调试信息是调试代码错误的基本方法之一。

通过在代码关键位置打印相关变量值或执行状态信息,可以帮助我们了解程序的运行过程和结果,从而找出问题的原因所在。

在代码中添加日志输出语句,并设置不同级别的日志等级,可以方便地控制调试信息的输出量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

仅基于失败运行的错误定位 背景介绍 错误定位通常依赖成功与失败运行两方面,但成功运行通常易受巧合正确性的影响,并且现代软件自动产生大量关于失败运行的bug报告。仅基于失败运行的错误定位方法(简称FOnly)是一个有效的仅基于失败运行来错误定位的新技术。 当错误程序的一次运行传递了一个错误时,可能是程序内部语句的原因。在运行中,通常也会执行其他程序的语句,这些语句可能将错误传播给其他的内部语句。如果这些语句产生了显著影响,就会导致失败的出现。 一旦程序工程师发现失败的出现,就会调试、定位错误、弥补错误并确认移除了这一错误,然而,调试过程依旧很艰辛,错误定位也通常被认为是这之中最难的一部分。 最近亚洲的研究在程序错误定位自动化上有了显著突破,这些技术通常是基于成功运行与失败运行共同实现的。然而,这之中的成功运行可能激活了错误但不至于引起失败运行的出现。更进一步讲,很多系统如今能自动检测失败并产出大量有用的关于失败运行的bug报告。基于此,我们提出FOnly,一个仅基于失败运行数据定位错误的革命性技术。

技术介绍 在过去20年,有很多新颖的错误定位技术出现,为了比较这些技术,我们将他们分类,分类依据是研发时是否使用错误/成功运行数据,并列出他们使用这些运行的数目。 我们仅列出在源代码中定位错误的技术,包含了诸如delta debugging,semi-proving这些仅揭露导致程序失败的可疑输入范围的技术,也有检测或制止失败出现的技术如Eraser。 下表便是这些数据的详细信息,最左两列是失败/成功运行数,第三列列出了这一原理早年的代表性项目,最后一列是与亚洲一流学者相关的最近提出的项目。 使用成功运行的隐患是可能出现激活了错误却没有引发失败出现的情况,这就是巧合正确性。上表下面三个技术就存在这样的隐患,早先的原理诸如chislice,nearestneighbor ,Tarantula也不可靠如若巧合正确情况出现。最近亚洲的研究就在解决这一问题。 CP是一种通过计算运行中基本块转变为错误块的频率并通过程序控制流图中的相似系数测量后向传播错误—失败关联的技术,这样的计算结果是传递错误的代码有较高的秩。 Hong Cheng和他的同事在C程序中通过分析bug报告中的最具识别图模式来定位错误。 Saha与其合作者在ABAP语言的SAP系统中定位错误切片,其方法是从失败运行中得到程序环,构建数据库需要独立切片作为起始点,在将单独的错误运行划分给这些切片,他们之中存在正确数据记录并被视为成功运行,然而在成功运行中依旧蕴含着巧合正确性。 另一种方法解决巧合正确性影响的是完全放弃正确运行的使用。Findbug这种数据分析工具是同时不使用成功与失败运行的,他在程序运行时产生报警,再通过多次运行来确认警报点。动态切片技术是在只有一个错误运行的情况下生成所需的语句切片集。与Tarantula类似,Ochiai这类调试工具也能不使用成功运行来定位,但是这种野蛮的方法是非常没有效率的。 据目前所知,使用一个或多个失败运行而不使用成功运行来定位错误的研究是非常少的,在过去这种方法被认为是不现实的是因为任何程序编译时候都是希望出现0错误,但是由于目前新兴的动态bug监测器能快速监听运行过程并给出大量错误报告,这种方法就不再是不可行的了。 因为现代软件的内置工具通常可以监测失败运行并汇报出来,软件调试者就会收到大量错误报告,然而生成与其数目相等的成功运行来进行定位分析又会花费大量时间,这就促使了仅用失败运行来定位错误的技术的出现。 我们基于以下概念假设提出FOnly技术:若已知一个错误程序的一次特定运行,若该运行通过错误程序实体(语句)次数越多,就越可能导致失败运行的出现。对于另一个语句而言,若上述趋势在错误运行中没有被发现,则后者的错误几率就相对小些。 趋势估计,是目前非常流行的技术之一,也是我们FOnly的核心。这一概念的简单阐释是使用最小二乘方法找到回归线,这样的线就能揭露出给定案例的趋势。 在统计不同失败运行通过同一语句的次数的基础上,FOnly可以进一步找到拟合误差最小化的回归线,然后使用回归线的斜率和拟合误差值计算信噪比,这一数据代表了对语句错误关联性的估计。高信噪比的语句被视为有更高的错误相关性。

我们使用一个例子来证明Fonly如何应用错误假设来实现趋势估计从而定位错误:图1a是两个代码段,上面的代码段包含了if语句和变量检测及对应功能,若布尔表达式是真,则函数addstr修改变量dest。否则不改变它的值,下面的代码实现了输出功能。 若此时在上面的代码段中L115开始的if语句错误(遗失L116),那么产生错误后的代码就更有可能使表达式为真,所以L121执行几率也就相应增加。因此,dest就可能有了错误的值。除非isalnum函数返回假值,L115的错误都是与原有正确结果不同的。 一般来讲静态预测字串内容是困难的,所以错误语句产生错误的概率我们很难知道。 我们在SIR提供的5542个测试用例上执行错误程序,对每条语句,我们记录每次运行中执行该语句的次数为c。对于一次执行计数中的每个值C0,我们记录编号N(c)的运行有一个计数c=c0,并计算其失败率,也就是N(c)次运行中失败部分的比率。 通过将L121,L497,L500与L115的距离进行比较,我们可以知道L121距离错误语句最近,而它也确实是最可疑的,因为可以通过它修改变量的值。同时我们检查代码以保证错误与L497,L500无关。 对于上述4句话,我们绘制关于其失败率与执行计数的图,并使用最小二乘法进行回归线线性拟合。其结果如图1b所示。

可以看出,随着执行计数的增加,L115与L121的失败率增加明显快于L497与L500,所以错误无关的语句也就有相对小的斜率,对于L500而言,其与错误语句最不相关,所以变化也最不明显。 然而,这个简单的实例并没有考虑线性拟合误差,这一误差需要成功运行与失败运行两方面的信息,在接下来的章节里,我们的工具会处理这些问题。

FONLY如何工作 设想一个程序是由一系列程序实体(诸如语句)来构建的,给定一些程序的执行结果,将其定义为程序运行集。Fonly通过比较每个程序实体的可疑性来进行错误定位,而可疑性是通过运行集中的失败趋势来度量的。 下图(图2)显示了其四个阶段,接下来我们依次介绍。

分割阶段:给定程序实体(诸如语句),Fonly划分程序运行集为不相交的分割,每个分割包含了所有经过同一实体相同次数(假定c次)的运行记录,之后计算每个分割中失败运行的比率,记为失败率F(c). 校准阶段:对于一个给定的实体s,F(0)这一分割的失败率,既没有一次运行经过了s。 如果分割中所有运行都没有经过s,后者不应与任何失败相关联,若F(0)此时非0,则应置为0,同样的,其他分割可能也对s进行了非0赋值,基于此,Fonly提出了校准失败率G(c)=F(c)-F(0),从而对经过程序实体s正好c次的运行导致失败的几率进行更准确的度量。 线性拟合阶段:基于上一阶段,Fonly在线性拟合阶段对每一个程序实体进行失败趋势估计。 对于任何给定的实体,通过给每个c配对相应的G(c),Fonly在2D空间创建一个点(c,G(c)).对于一个错误相关的实体,G(c)是关于c的离散且单调递增的函数。 在2D空间中Fonly使用线性拟合对程序实体进行错误相关性度量。 这里有两种方法度量经过s正好c次没有引发失败的可能性:第一种是直接使用G(c)并设置可能性为1-G(c);第二种是使用执行实体s直至c次都没有引发任何失败的可能性。这个可能性表达式是:,这里p表示运行一次而导致失败的可能性。将二者结合为公

式:

f(x)能被展开为无穷级数:,这里表示f(x)在0点的i阶导数。

所以我们推导校准正确率可近似表达为: 从而简化为G(c)=l*c. 所以,巧合正确率是由过(0,G(0))点且斜率为l的直线来表示的。 Fonly使用最小二乘分析将线性拟合误差最小化。

给定程序实体,斜率l可以表示为:

标准差可以表示为: 其中D是所有可能经过实体的运行次数的集合。 然而,经过实体的运行次数可能各不相同,所以在比较前我们应该将每个特定实体的l

标准化为:,这里cmax表示程序运行可能经过特定实体的最大可能次数。 为了在同时存在成功运行与失败运行的情况下度量每个实体的错误相关性,Fonly计算秩数R,它等同于信噪比并以标准化后的l和标准差来定义: 秩越大,程序实体错误相关性越高。

秩的值域是,若程序实体s没有样本点,没有经过s的失败运行,则秩R为-∞,其意思是s具有最小可疑性;若实体s只有一个样本点,斜率l未定义,秩R定为0;若标准差为0,秩无法直接计算,此时,若经过s的失败数为0,则为-∞,否则就是其上限+∞。 消除阶段:与其他相关研究不同,Fonly添加了一个阶段消除在计算程序实体错误相关性时对成功运行次数的依赖。 在这一阶段,它使用了仅基于失败运行的公式。对于任何程序实体s,N(c)表示程序运行次数,这之中每个运行都正好经过s实体c次。Fonly计算与c值无关的平均运行次数,

它替代了每个不同的N(c)从而计算得到平均秩这是与失败运行相关而与成功运行无关的。

其中Y(c)是正好经过实体c次的运行中的失败运行次数。 当然,若成功运行集可靠,消除阶段就是可选择的了。

实验分析 为了验证Fonly的效果,我们使用SIR中的错误程序来进行相关研究,下表2就是实验数据。 在每个程序版本中使用1到3个错误来模拟单一/多错误情况,结果是186个单错误版本,20个多错误版本。

为了比较Fonly的性能,我们将它与Tarantula,Ochiai,Jaccard,与统计定位bug技术(SBI) 因为这些技术都是在失败与成功运行都存在的情况下研发的,所以我们先将测试库中的每个程序版本在上述测试工具中都运行一遍,之后再进行仅失败情况的测试。 依据之前的研究,我们定位错误的效率通过找到错误语句时检查语句的百分比来度量。

相关文档
最新文档