《conTest》(zip)下载
一种专门进行并行测试的工具。
原理:ConTest 背后的基本原理是非常简单的。instrumentation 阶段转换类文件,注入挑选的用来调用 ConTest 运行时函数的位置。在运行时,ConTest 有时试图在这些位置引起上下文转换。挑选的是线程的相对顺序很可能影响结果的那些位置:进入和退出 synchronized 块的位置、访问共享变量的位置等等。通过调用诸如 yield() 或 sleep() 方法来尝试上下文转换。决定是随机的以便在每次运行时尝试不同的交错。使用试探法试图显示典型的 bug。
注意 ConTest 不知道实际是否已经显示出 bug -- 它没有预期程序将如何运行的概念。是您,也就是用户应该进行测试并且应该知道哪个测试结果将被认为是正确的以及哪个测试结果表示 bug。ConTest 只是帮助显示出 bug。另一方面,没有错误警报:就 JVM 规则而言所有使用 ConTest 产生的交错都是合法的。
正如您看到的一样,通过多次运行同一个测试得到了多个值。实际上,我们推荐整个晚上都反复运行它。然后您就可以很自信地认为所有可能的交错都已经执行过了。
ConTest 的特性
除了它的基本的方法之外,ConTest 在显示并行 bug 方面引入了几个主要特性:
* 同步覆盖:在单元测试中极力推荐测量代码覆盖,但是在测试并行程序时使用它,代码覆盖容易产生误导。在前两个例子中,无修饰的 NamePrinter 和多 bug 的 Print Queue,给出的单元测试显示完整的语句覆盖(除了 InterruptedException 处理)没有显示出 bug。 同步覆盖弥补了此缺陷:它测量在 synchronized 块之间存在多少竞争;也就是说,是否它们做了“有意义的”事情,您是否覆盖了有趣的交错。有关附加信息请参见 参考资料 。
* 死锁预防: ConTest 可以分析是否以冲突的顺序嵌套地拥有锁,这表明有死锁的危险。此分析是在运行测试后离线地进行。
* 调试帮助:ConTest 可以生成一些对并行调试有用的运行时报告:关于锁的状态的报告(哪个线程拥有哪个锁,哪个线程处于等待状态等等),当前的线程的位置的报告和关于最后分配给变量和从变量读取的值的报告。您也可以远程进行这些查询;例如,您可以从不同的机器上查询服务器(运行 ConTest)的状态。另一个对调试有用的特性可能是重放,它试图重复一个给定运行的交错(不能保证,但是有很高的可能性)。
* UDP 网络混乱:ConTest 支持通过 UDP(数据报)套接字进行网络通信的域中的并行混乱的概念。 UDP 程序不能依靠网络的可靠性;分组可能丢失或重新排序,它依靠应用程序处理这些情况。与多线程相似,这带来对测试的挑战:在正常环境中,分组往往是按正确的顺序到达,实际上并没有测试混乱处理功能。ConTest 能够模拟不利的网络状况,因此能够运用此功能并显示它的 bug。
挑战与未来方向
ConTest 是为 Java 平台创建的。用于 pthread 库的 C/C++ 版本的 ConTest 在 IBM 内部使用,但是不包含 Java 版的所有特性。出于两种原因,用 ConTest 操作 Java 代码比操作 C/C++ 代码简单:同步是 Java 语言的一部分,并且字节码非常容易使用。我们正在开发用于其他库的 ConTest,例如 MPI 库。如果您想要使用 C/C++ 版的ConTest,请与作者联系。硬实时软件对于 ConTest 也是一个问题,因为工具是通过增加延迟而工作。为使用 ConTest,我们正在研究与监视硬实时软件相似的方法,但是在目前我们还不能确定如何克服此问题。
至于将来的方向,我们正在研究发布一种 监听器 体系结构,它将允许我们在 ConTest 上应用基于监听器的工具。使用监听器体系结构将使创建原子数检查器、死锁侦听器和其他分析器以及尝试不必写入有关的基础设施的新的延迟机制成为可能。
[ 本帖最后由 seesill 于 2008-3-28 21:04 编辑 ]
附件: 您所在的用户组无法下载或查看附件