没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记174(2007)151-165www.elsevier.com/locate/entcs用ANOJ实现最小程序变异生成的自动并发编译Shady Copty以色列海法大学海法校区,31905Shmuel Ur以色列海法大学海法校区,31905摘要编程是程序设计中最耗时的活动之一。 自动调试的工作已经受到了极大的关注,并且有许多专题讨论会致力于这个领域。 自动调试通常在测试在一种情况下失败,但在另一种情况下成功时调用。例如,测试在程序(或调度程序)的一个版本中失败,但在另一个版本中成功。自动调试搜索导致故障的最小差异。这在识别和修复bug的根本原因一种新的并发程序测试方法,通过修改并发程序的时间表来发现并发程序的错误。此方法旨在增加并发错误(如竞争,死锁)出现的概率。本文讨论了将这种新的测试技术与自动调试相结合的问题。金。我们可以通过找到揭示bug的最小检测集来精确定位bug的位置,而不是仅仅显示bug的存在。除了解释这种集成的方法之外,我们还展示了一个基于AJAX的实现。我们详细讨论了实现,因为它既展示了开源工具的适应性优势,又展示了我们的特定更改如何用于其他测试工具。关键词:交错,多线程,Delta,软件工程,测试与调试1介绍和动机并发Java编程的日益普及--对于Internet以及服务器端--已经将并发缺陷分析的问题带到了1电子邮件:copty@il.ibm.com2电子邮件:ur@il.ibm.com1571-0661 © 2007 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2007.04.001152S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151最前沿并发缺陷,如无意的竞争条件或死锁,发现和分析起来既困难又昂贵,而且这些故障经常会逃逸到现场。多核处理器的生产是另一个趋势,它突出了在客户机空间中测试和调试多线程应用程序的需求。因此,诸如Intel、IBM和Microsoft等商业企业越来越重视为该领域开发方法和工具在测试多线程程序方面已经做了很多研究。研究已经检查了数据竞争检测[20],[21],[15];分布式和并发上下文中的重放[4];静态分析[23],[14],[7];以及生成不同交织以揭示并发故障的问题[8],[24]。模型检查[22],覆盖分析[18],[9],[3]和克隆[13]也是用于改进该领域测试的技术。在之前的文章[6]中,我们演示了如何构建一个测试工具,在ANOJ之上运行交织。AASPJ为Java语言实现了面向方面的编程。使用12行的AIBRANT J,我们创建了一个类似于ConTest的测试工具[8],这是一个IBM商业工具,被证明在发现并发错误方面很有用。这种测试工具[8],[24]通过使用随机执行的sleep语句来检测可能影响程序结果的时间的位置,例如对全局变量的访问。当我们想要执行一个完整的ConTest实现时,我们发现ANOTJ缺少一些特性。由于AIBRJ是开源的,我们声称测试工具制造商可以自己添加这些功能,而无需等待包含它们的AIBRJ版本在本文中,我们描述了我们的工作,一个新的调试工具,是基于噪声产生测试技术。 在我们的上下文中,噪声创建是插入延迟,随机或以其他方式修改测试中程序的时序。噪声生成在发现间歇性bug时非常有用。我们的工具寻找包含揭示bug的工具的最小噪声集。如果可以找到一个或多个位置,在这些位置,噪声的检测揭示了错误,这些位置的描述对开发人员非常有用。正如预期的那样,我们的实验发现,在调试中,知道线程切换在哪里导致bug出现是很有价值的。 一种不同的方法[10]使用遗传算法。在这项工作中,他们不是寻找最小的变化集,而是寻找 产生最大可能性发现错误的更改集我们的工具的实现和动机与所表达的类似在一系列关于delta调试(DD)的论文中[5],[25],[26]。 在这些文件中,A一组程序更改被用来诱导一个错误,目标是找到一个最小子集。这组变化来自两个程序版本之间的差异:旧的版本可以工作,新的版本包含一个bug。 在本文中,使用测试仪器技术自动计算引起错误的变化的概率,并且与用户程序变化无关。由于不同的要求,我们实现了一个略有不同的DD算法使用ANOJ,并解释其优点。实现需要编写方面和工具代码,以及修改ANOJ。这项工作是欧盟项目SHADOWS的初步研究的一部分,该项目的目标是S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151153创造自我修复的技术。对于依赖于特定交织的间歇性错误,可以自动检测并删除导致错误的交织。虽然这项工作还不成熟,我们相信,这是有趣的,由于以下贡献:我们表明,至少在小程序,DD技术和测试通过噪声生成的组合产生一个实用的并发调试技术。我们展示了一种新的DD算法,在某些情况下,比文献中发现的更好。此外,还详细介绍了实际实现,其中包括可应用于到其他应用程序。2相关工作编程是计算机程序开发中最常见的活动之一,并且对其自动化给予了很多考虑。在并行程序设计中,同样的测试有时会失败,有时会成功。在[5]中,DD在交错中发现了指示失败的位置这些位置是使用一个名为DEJAVU的重放工具来识别的,该工具在一个特殊的确定性JVM上使用。在回归测试中,检查程序的新版本,看看它是否包含错误。一旦测试发现了bug,自动调试的目标是找到产生bug所需的更改的最小子集在[25]中可以看到一个这样的例子,其中存在两个版本的这些程序之间的差异是178,000行代码。使用DD,导致bug的单行被自动定位。类似的想法也适用于另一个领域,其中测试被简化为显示错误所需的基本部分[26]。DD在减少bug报告的数量和理解这个bug的核心需求方面很有用在这些应用中使用的算法可以在[25]中找到,其中它用于找到一组变化,前提是保证单调性和一致性这通常是测试多线程应用程序时的一个问题,因为执行相同的测试可能会产生不同的结果。这个问题可以通过在确定性JVM上使用重播来避免。通过插入时间表修改状态(“噪声”)(如睡眠和产量)来测试多线程应用程序这是一种有效的技术,用于找出是否存在错误,但它不寻找错误的根本原因。研究已经完成,以找到插入噪声的正确点[2]。这些研究发现,在许多地方的噪音并不像在一些正确的地方插入噪音那样有效。这意味着太多的噪声可能会掩盖bug,或者使用[25]的定义,问题是非单调的。对多线程程序中错误模式的研究[12],[17]揭示了大多数错误模式可以使用很少的检测点来暴露,有时只有一个。然而,仪表化噪声必须是非确定性的,即, 每次执行交织时不影响交织的噪声。这一要求154S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151意味着测试必须检查噪声是否在正确的位置,并且其本身是不确定的。有时,即使噪音在正确的地方,它也不会产生错误。我们使用ApplyJ(Java的面向方面扩展)实现了我们的工作。只需几个新的构造,AIBRJ就可以扩展Java,为一系列横切关注点的模块化实现提供支持[19]。动态横切使得在程序执行过程中定义在某些定义良好的点上运行的额外实现成为可能。静态横切使得在现有类型上定义新操作成为可能。在AsiaJ中的动态横切是基于一个小而强大的构造集:连接点是程序执行中定义良好的点;切入点是引用连接点集合和这些连接点上的某些值的一种方法;建议是用于定义连接点上的附加行为的类似方法的构造;和方面是模块化横切实现的单元,由切入点、通知和普通Java成员声明组成。我们使用动态横切来实现ConTest的功能,使用ANOJ,以类似于ConTestinstrumentor [16]所使用的方式。在ANOJ中,切入点挑选出程序流程中的某些连接点。例如,切入点调用(void Point.setX(int))挑选出每个连接点,这些连接点是对签名为voidPoint.setX(int)的方法的调用(即,Point一个切入点可以用and、or和not从其他切入点构建[1]。ANOJ还允许您使用通配符定义切入点。例如,set(* *)定义了程序中所有变量的赋值。切入点挑选连接点,但我们使用建议来实现横切行为。 一个建议汇集了一个用于挑选连接点的切入点,以及在每个连接点上运行的代码体。 Awesome J有几种不同的建议。 “在建议之前” 在程序继续进行连接点之前,到达连接点。“After advice”在程序继续该连接点之后运行。 ”Around advice” on a join point runs as the join point is reached [ 切入点和建议类型定义了插装在哪里,建议体定义了实际插装的内容3算法本节描述我们用于找到发现缺陷所需的最小数量的计算的算法。首先,我们必须处理错误不是确定性的事实。 如果执行成功(即, 如果它发现了bug),它确实这并不一定意味着仪器处于正确的位置,因为无论如何都会以某种程度的概率发现错误。 当执行未能找到bug时,这并不一定意味着插装不在正确的位置,原因有两个。如前所述,必须有概率地激活检测,并且在此执行中,它可能在错误的时间被激活或根本没有被激活此外,可能存在其他线程切换S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151155∈| |在没有安装仪器的地方,掩盖了错误。我们分别处理这些问题。我们选择用于调试的测试是通过插入噪声来发现bug,但如果没有添加噪声,则不会发现bug。 看时只有在这样的测试中,如果仪器在错误的地方,测试发现bug的可能性很小。这种方法的缺点是,即使没有使用噪声,也不能自动调试出现的“简单”错误。我们没有一个解决方案,为众多的情况下,出现的错误是常见的,但找到错误的根本原因是困难的。 我们解决事实上,即使是正确的插装也可能不会每次都产生bug,因为每次都要多次运行每个测试,并查看bug是否出现在任何一次执行中。 测试必须执行的次数取决于测试的bug是隐藏的。这个数字可以在发现bug后进行微调。根据我们的经验,10到30次执行通常就足够了。假设s1,s2... snS是可能的程序改变的集合。选择程序更改,以便每个更改可以揭示现有的错误,但不会在程序中创建新的错误。必须认真实施这些变革。在[8],[24]中解释了如何将这些更改应用于Java程序的理论和实践。一个被称为坏的更改可能隐藏了一个现有的bug。如果存在坏的变化,找到一个最小的变化集变得更加困难。我们目前的工作表明,这是很有可能的。 一个变化集是单调的,如果对于每个发现bug的集合,它的所有超集也发现bug [25]。仪器之间的相互关系的存在可能会导致我们的问题是非单调的。一个非常重要的问题是F的预期大小,这是揭示bug所需对bug模式的研究[12],[17]表明F通常非常小,并且通常是单例。找到一个singleton很容易。我们使用的最简单的算法创建程序的n个突变,每个突变都是通过添加一个sleep语句创建的,然后检查哪个突变找到了bug。这个简单算法的优点是它的简单性和它不注意坏的变化的存在。缺点是它的复杂性,因为可能的变化的数量在S中是线性的。我们从中选择的更改数量取决于对包含同步元素的文件中的全局变量的访问数量;这大约是我们查看的程序(主要是第二个缺点是,这个算法只在变更集是单例的情况下才有效。如果需要一个以上的更改,则此算法失败。为了减轻复杂性问题,实施第二算法来执行搜索。 为了搜索,我们需要对元素集执行查询。 我们使用查询Q,它接收sS,如果Fs则返回Yes,否则返回No(即,f∈F,x∈/s)。在这个算法的每个阶段,我们应用剩余变化的一半。 如果一个bug如果找到了,我们继续处理那一半,如果没有,我们继续处理另一半。该算法的复杂度是log(n),这是非常好的;然而,它仍然限于单例解决方案。如果解决方案不是单例的,那么我们选择的那一半可能包含了变更的子集,在这种情况下我们继续另一半156S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151⊂而不是找到解决方案。如果问题是非单调的,搜索算法可能不起作用,因为没有找到错误并不意味着不包括解决方案在布景里我们开始设计一种算法,该算法被优化以搜索小集合,因为我们期望大多数解决方案都很小。该算法的另一个优点是每个查询都有相对较少的更改。 这种特性是可取的为了效率,因为每个仪器都在运行时间和准确性方面产生成本。我们已经看到[2],具有更多工具的程序不太可能表现出而不是一个程序,使用较少的仪器,但在正确的地方有它。从性能的角度来看,使用更少的仪器也是有益的。由于存在不良的工具和问题的非单调性,我们拥有的工具越少,我们面对这些问题的可能性就越小,当然,假设工具是正确DD是用于搜索变化集的公知算法。在[25]中建议的DD算法的工作原理如下:从两个集合c cJ开始,这样程序可以用c工作,不能用cJ工作。 以c作为空集开始, cJ作为发现bug的完整更改集。 然后,将变化大致分为CJ在两个。如果用第一部分测试产生了bug,那么继续递归地测试该部分。如果没有,试试第二部分。如果这部分产生了bug,那么继续递归。否则,解决方案的一个子集必须在第一部分中,另一个子集必须在第二部分中。第二部分。 继续递归搜索第一部分,同时实现从第二个开始的所有变化。与此同时,搜索第二部分,同时实现对第一部分的所有更改。最小解是两个搜索的并集。图1(a)[25]描述了使用该算法搜索最小子集。除了非常简单并在实践中得到证明之外,该算法还具有并行性。当搜索被分割时,搜索的两个部分是独立的,可以并行进行。 如果有足够的处理器, 该算法是对数的变化的数量调查。 处理器的数量与发现的更改数量相等就足够了,这个数量通常很小。(a) Delta ®(b)Modified Delta ®Fig. 1. 增量调试和修改的增量调试如上所述,对于我们的应用,希望保持每个测试中的变化数量[25]中的DD算法可以修改为需要较少更改的顺序算法如果所有的变化都在a部分S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151157∪∪或乙部,则没有改变。如果a和b都有更改,则在a部分搜索相关更改(如前所述)。接下来,在b部分中搜索相关的更改,同时只保存a部分中的相关更改(而不是保存所有更改)。虽然该算法不能再并行化,但当在单处理器上运行时,它对我们的应用程序在实验中,我们使用了BinarySet算法,它比修改后的DD算法更好,并使用以下程序实现(i) 从1到N,依次分配给修改数(ii) 创建一个插装集合S,它是进程的输出,并使用空集初始化它(iii) 创建一个索引I,该索引等于最后找到的检测点的索引然后用N初始化它(iv) 重复直到S是溶液(即, 发现一个bug)。(a) 使用二进制搜索查找1中最小的K。I,使得Q(1. K-1S)没有找到bug,Q(1... KS)做的。(b) 设置I为K-1。(c) 把K加到S上。实施例3.11.100是可 能 的修改。F ={1,20,40,60}找索引最大的那个Q(1.. 50)repliesNo as thereis one outside(60)Q(1.. 75)回答是的,等等。.... 直到我们发现它是60将第60项修改添加到S,将I更改为59S仍然不是解决方案,继续开始寻找第二个Q(1.. 30,60)repliesNo(because of 40)Q(1.. #35750;的回答,是的。... 直到我们发现它是40将第40项修改添加到S,将I更改为39当S成为一个解时(我们找到F),我们就完成了该算法比我们对DD算法的修改稍好。 为了找到一个单例(如果我们不知道回复是单例),DD算法的平均复杂度是1.5log(N)。这是因为每次我们检查,我们在第一次尝试中选择的概率为50%,158S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151一下当解决方案是少量变化时,大致相同的计算也成立。另一个优点是,我们的查询,平均而言,有一个更少的仪器。4执行我们使用了几个子组件来实现我们的解决方案。这些组件执行以下操作:• 提取我们可能想要添加噪声的所有可能位置的集合S。(请参阅[8]关于在哪里做这件事• 任何子集的仪器噪声均为零。• 确定应用了噪声的程序是否显示并发错误。以下各节将回顾这些子组件,并解释我们如何实现-他们的记忆4.1提取可能更改的初始集合我们的技术使用ANOJ来提取可以添加噪声的所有可能位置的集合。 AjaxJ的编译器使用-showWeaveInfo选项来打印列出所有被建议的切入点的信息。资料以下列格式提供:类型在来自我们提取所有可能的变量集,并通过使用-showWeaveInfo选项在编译器中,导入java.util.*;public aspectInitial extendsThread{ pointcut noiseVictim():((get(* *))||set(**))&&在(!初次));privatestaticRandom rand= new Random();before():noiseVictim(){if(rand.nextInt(100)==1){//激活概率return();}}}S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151159这与[6]中用于仪器噪声的方面相同。就我们的目的而言,建议本身并不重要;重要的是获得所有的位置。4.2将更改的子集应用于程序由-showWeaveInfo检索的信息以类名和行号对的形式打印出位置。我们面临的问题是,ANOJ的切入点不支持特定的行号。因此,没有办法告诉ANOJ在特定的行号上进行仪表化。好消息是,ANOJ是开源的,我们能够改变切入点类型,以允许特定行号的仪器。我们更改了“Within”切入点,使其接收两个参数,一个类型模式和一个行号,其中(0)表示一个行的行号。例如,有一个名为ClassA的类,它可以访问第1、2和3行。为了插入第2行和第3行,我们创建了一个方面,如下所示:导入java.util.*;public aspect noiseAspect extendsThread{ pointcut noiseVictem():((get(* *))||set(**))&&within(ClassA,2)&&在(ClassA,3)&&内(!NoiseAspect,0));privatestaticRandom rand= new Random();before():noiseVictem(){if(rand.nextInt(100)==1){//激活概率yield();}}}将这个方面编织到调试程序中会给ClassA的第2行和第3行增加噪声。需要进行一些修改以将此更改添加到ANOJ中:• 对WithinPointcut类它的构造函数现在接收两个参数:一个类型(和以前一样)和一个行号。行号保存在私有数据成员中。方法方法“fastMatch”不能再用于模式匹配,因为FastMatchInfo不保留行号。我们决定不修复这个,现在···160S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151fastMatch返回FuzzyBoolean.MAYBE;。“equals”方法现在除了测试类型模式之外还测试行号。用于序列化的PatternParser类现在需要WithinPointcut的第二个参数,它使用我们的新构造函数从该参数创建新的WithinPointcut对象为了确定在所有位置的子集上检测的程序是否揭示了bug,我们执行程序多次。如果bug出现的次数超过了指定的阈值,我们就宣布它成功了。4.3把它放在一起我们从一个包含bug的程序开始,这个bug在程序正常运行时不会出现,但在使用噪声时会出现。我们首先检索所有可能的位置的集合,可以用噪声进行检测。然后,我们应用上一节中描述的搜索算法之一。在每次迭代中,对于所有可能位置的给定子集,我们为特定子集创建一个方面,用我们修改后的AsiaJ版本将其编织到调试程序中,然后测试bug是否出现足够的次数。 然后我们继续到下一次迭代。5实验我们进行了几个实验来证明我们的方法的可行性,主要是从并发bug基准[11]中获取的代码。我们说明了approach使用合成程序创建这项工作和一个程序从太阳,演示并发问题。对于每个程序,我们检查第3节中描述的每个搜索算法5.1递增运算符在Java中,增量运算符不是原子的。 一个常见的错误是认为因此,如以下程序所示01. public class Thread { 02.03.private static long sharedVariable=0;04.05.public voidrun() {06.07.08.public void run() {09.++;10.}11.12.···S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)15116113.publicstatic void main( String[] args)抛出InterruptedException {14.System. out. println();15.System. out. println();16.int findDuplicate();17.int findDuplicate();18.sort();19.sort();20.System.out.println();21.}22.}这个程序在第9行有一个bug。为了让这个程序正常工作,我们应该在增量操作符周围添加一个同步。当我们在这个程序上运行我们的工具时,所有三个搜索算法都报告第9行是有问题的。 该程序有三个程序位置,它们是检测的候选位置-第3、9和20行。 表1显示了迭代次数每种搜索算法都需要找出漏洞的位置。正如预期的那样,二进制搜索效果最好。二进制集搜索算法需要额外的迭代。 这是因为在发现每个位置后,它会检查是否它已经找到了最小子集或者是否需要更多的搜索。此检查需要额外的迭代。算法迭代次数线性3二进制2二进制集3表1发现原子程序的bug位置所需的迭代次数5.2银行模拟器这个由Sun创建的用于显示并发问题的程序模拟了一个有多个客户的银行。每个客户都可以决定从各自的银行账户中随机存入或提取一定数量的钱。银行维持所有账户和银行本身的余额。 银行存款余额是所有账户的总和。在这个程序中,程序员为银行余额保留一个变量,为客户保留一个余额数组。客户每次执行操作时,银行余额和客户余额都会更新。问题是这个更新不是原子地完成的。 该程序有29个可能的噪音位置。表2显示了二分查找对于这个程序是最有效的。所有的搜索算法都指向银行类的第78行。162S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151...76.public int findDuplicate(int []nums){77.accounts[id].余额+= sum;78.Bank_Total += sum;79.}...算法迭代次数线性29二进制5二进制集6表2发现银行模拟程序的错误位置所需的迭代次数平均而言,我们期望线性搜索的迭代次数为一半仪器的位置。 在这个例子中,它恰好是最后一个位置这就是为什么我们有这么多的迭代,但即使是一半的位置数量也远远超过一个日志。5.3两个地点我们合成了一个简短的程序,其中一个位置不足以揭示错误。我们选择这个程序是因为它的整个代码可以在这里显示。我们已经在该领域看到了很多例子,其中一个位置是不够的。01. public class Thread { 02.03.04.第一次见面05.int x=1;06.private static int z=4;07.08.public int findDuplicate(int nums) {09.this.mode= mode;10.}11.12.public void run() {13.if(0){14.for(int i=0; i 10000; ++i){ 15.if(x!(0)16.尝试{17.z= 5/x;18.} catch(Exception e){System.out.println(“bug”);}19.}S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)15116320.}21.}22.否则{23.inti=0; i = 0;++i24.{25.int x=1;26.return 0;27.int x=1;28.}29.}30.}31.32.公共静态空main(String[] args)33.抛出InterruptedException34.int maximum = new maximum(0);35.String getString(1);36.37.int findDuplicate();38.int findDuplicate();39.sort();40.sort();41.System.out.println(z);42.}43.}这个bug需要通过第26行和第17行的交错出现在这个节目中。 因此,在这两个位置之一添加噪声是不够的. 如果我们只在第26行添加它,那么第15行将保护bug。 如果我们只在第17行添加它,调度器选择在第26行执行上下文切换的机会很小。该程序有11个可能的位置可以添加噪声。正如预期的那样,试图找到单个位置的两种算法都失败了。通过二进制集合搜索检测到的集合包括行17和27,并且在八次迭代之后被找到。线性搜索必须检查所有可能的位置才能得出失败的结论,而二分搜索只需要两次迭代就可以得出相同的结论。6结论和今后的工作本文包含三个贡献:一个技术,用于查明并发故障的位置,一个新的三角洲调试算法,并修改ADMJ,使更多的测试技术的实施自动定位相关并发错误的技术是自动修复并发错误的在以前的工作中,我们暴露了现有的错误并研究了错误模式。在确定错误位置之后,下一步是建议修复。这一目标还远未实现,特别是164S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151在无监督模式下,但我们相信本文所示的工作是朝着正确方向迈出的重要一步为了实现我们的目标,我们开发了一种新的DD算法。该算法优于我们的实现,并可能进一步使用到其他应用程序。传统的DD算法可以很容易地利用并行计算的优势。不同的使用场景适用于不同的算法。我们现在正在实际应用中进行实验。关键点是单调性问题。如果,在实践中,该问题被证明是单调的,那么本文提出的算法有实际应用。 即使有100,000个检测点,由于算法的对数性质和使用场景,运行时间也是合理的。如果问题是非单调的,那么替代搜索技术将是必要的。另一个问题是,即使可以看到bug,暴露它的概率取决于所选择的检测点。如果它下降到某个阈值以下,就很难检测到它。为了自动发现错误,需要运行许多测试。在长时间运行的测试中需要更长的时间。使用这种技术也可以发现死锁,因为发现它们的测试使用超时或寻找循环锁概率。在我们之前的工作中[6],我们看到ANOJ可以用于测试,但由于缺少一些功能,无法满足ConTest [9]的需求。在本文中,我们充分利用了AANOJ是一个开源工具的事实,并对其进行了修改以满足我们的需求。执行我们对APDJ的更改相对简单,因为它写得很好,很容易理解。使用我们修改过的版本ANOJ,我们能够最大限度地实现我们的工具。我们所做的更改对于许多其他测试工具都很有用,例如,当执行覆盖测量并旨在减少性能影响时。覆盖率测量通常通过检测代码并测量执行了哪些检测点来完成。 主要的性能影响是由于 通常执行的工具。在每次测试之后,删除执行的配置点会产生非常好的性能。由于我们的增强,现在可以用ANOJ创建这样的覆盖工具我们很清楚,APDJ对于学术目的来说是一个非常强大的解决方案。创建工业强度工具时,必须对ANOJ进行一些更改,以使所有功能都能正常工作。根据要求,需要对每种工业工具进行专门研究,以检查APDJ是否合适。引用[1] ANOJ入门,http://www.elipse.org/aspectj。[2] Yosi Ben-Asher Yaniv Eytani和Eitan Farchi。用于发现并发bug的启发式方法。2003年国际并行与分布式处理研讨会,IPDPS 2003,PADESTIC Workshop,2003。[3] Arkady Bron,Eitan Farchi,Yonit Magid,Yarden Nir,and Shmuel Ur. 同步覆盖的应用。 在PPoPP'05:第十届ACM SIGPLAN研讨会会议记录《并行编程的原理和实践》,第206-212页,美国纽约州纽约市,2005年。Press.S. Copty,S.Ur/Electronic Notes in Theoretical Computer Science 174(2007)151165[4] 崔钟德和哈里尼·斯里尼瓦桑Java多线程应用程序的确定性重放在SIGMETRICS Symposium on Parallel and Distributed Tools,1998年8月。[5] 崔钟德和安德烈亚斯·泽勒 隔离导致故障的线程调度。在 ISSTA02:Proceedings of the 2002ACM SIGSOFT International Symposium on Software Testing and Analysis , pages210-220, New York,NY,USA ,2002 . Press.[6] Shady Copty和Shmuel Ur。 使用AOP进行多线程测试很容易,而且它能发现bug! 在2005年欧洲标准化组织会议记录。Springer-Verlag,2005.[7] James C. Corbett,Matthew Dwyer,John Hatterfly,Corina Pasareanu,Robby,Shawn Laubach,and Hongjun Zheng. Bandera : 从 Java 源 代 码 中 提 取 有 限 状 态 模 型 。 第 22 届 国 际 软 件 工 程 会 议(ICSE)。ACM Press,June 2000.[8] Orit Edelstein,Eitan Farchi,Evgeny Goldin,Yarden Nir,Gil Ratsaby,and Shmuel Ur.测试多线程Java程序。IBM System Journal Special Issue on Software Testing,2002年2月。[9] Orit Edelstein,Eitan Farchi,Yarden Nir,Gil Ratsaby,and Shmuel Ur.多线程Java程序测试生成。IBM Systems Journal,41(1):111-125,2002.也可通过http://-www.research.ibm.com/-journal/-sj/-411/-edelstein.html网站。[10] 亚尼夫·艾塔尼并发Java测试生成作为一个搜索问题。运行时验证的计算机研讨会论文集,2005年。[11] Yaniv Eytani和Shmuel Ur。编译一个记录了多线程错误的基准测试。 在IPDPS,2004年。[12] Eitan Farchi,Yarden Nir和Shmuel Ur。并发错误模式以及如何测试它们。在IPDPS,第286页,2003年。[13] A. Hartman,A. Kirshin和K.纳金一个测试执行环境,为分布式软件运行抽象测试。软件工程与应用论文集,SEA 2002,2002。[14] K. 哈夫隆 和T.汉堡包使用Java Path对Java程序进行模型检查。International Journal on Software Tools for Technology Transfer,STTT,2(4),April 2000.[15] Eyal Itzkovitz,Assaf Schuster,and Oren Zeev-Ben-Mordehai.面向DSM系统中 并行与分布式计算杂志。 Special Issue on Software Support for Distributed Computing,59(2):180 -203,Nov1999.[16] Gregor Kiczales,Erik Hilsdale,Jim Hugunin,Mik Kersten,Je Escherey Palm和William G. 格里斯沃尔德一个概述的ANOW J。计算机科学讲义,2072:327[17] Brad Long和Paul A.斯楚珀Java组件中并发失败的分类在IPDPS,第287页,2003年。[18] Y. Malaiya,N. Li,J. Bieman,R. Karcich,和B.斯基比软件测试覆盖率和可靠性。技术报告,科罗拉多州立大学,1996年。[19] 马 里乌 斯 ·马 林, 莱 昂 ·穆 宁, 阿 里 ·范·杜 尔森 。一 种基 于 横 切关 注 点类 型 的 方面 重 构方 法 。 在MACSPress.[20] B. 理查兹和J. R. 拉鲁斯基于协议 数据竞争侦测第二届SIGMETRICS并行和分布式工具研讨会论文集,1998年8月。[21] 斯 蒂 芬 ·萨 维 奇 Eraser : 一 个 多 线 程 程 序 的 动 态 竞 争 检 测 器 。ACM Transactions on ComputerSystems,15(4):391[22] Scott D.斯托勒模型检查多线程分布式Java程序。第七届国际SPIN模型检查集,2000年。[23] Scott D. 斯 托 勒 模 型 检 查 多 线 程 分 布 式 Java 程 序 。 International Journal on Software Tools forTechnology Transfer,4(1):71[24] Scott D. 斯 托 勒 使 用 随 机 调 度 测 试 并 发 Java 程 序 。 InProceedings of the Second Workshop onVerification(RV),Volume 70(4)of Electronic Notes in Theoretical Computer Science. Elsevier,2002年。[25] 安德烈亚斯·泽勒。昨天,我的计划奏效了。今天,它没有。为什么?为什么?在ESEC/FSE-7:与第七届ACM SIGSOFT软件工程基础国际研讨会联合举行的第七届欧洲软件工程会议,第253史普林格出版社[26] 安德烈亚斯·泽勒和拉尔夫·希尔德布兰特。简化和隔离导致故障的输入。IEEE Trans. Sof
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功