我正在开发一个使用一些第三方库的框架。框架客户端可以在多线程上下文中使用代码,但框架本身不会产生线程或使用共享内存或锁/同步。我在客户端环境中看到一些多线程问题,并且正在寻找确定性多线程测试框架,因为问题似乎出现在第三方框架中。
到目前为止尝试过:
1) 能够在jmeter性能测试环境中运行几次重现
2) 能够通过使用 testng 多线程注释的压力测试以不太一致的方式重现它。 (@Test(threadPoolSize = 10, invocationCount = 100, timeOut = 10000))
缺点:这只是在线程池中执行方法,不保证交错/静态代码分析或提供确定性重现的方法。
3) 尝试了 Junit 的 ActiveTestSuite 和@ConcurrentJunitRunner。类似于testng注解。
4) MultiThreadedTC : 似乎适用于基于锁/同步/共享内存的多线程代码
5) GroboUtils似乎更倾向于测试/监控共享内存
6) IBM ConTest 似乎已获得许可,但没有试用版供我们确保它符合我们的需求并要求我们的管理层购买。
有任何类似于 Microsoft Chess 或 HelGrind/DRD for Java 的建议,可以通过静态代码分析或字节码检测和回放记录特定线程交错以进行调试。
我也在考虑将此工具集成到我们的单元测试/构建过程中,以避免将来发生类似错误。
最佳答案
重现并发错误的记录和重放系统的主要挑战是需要记录大量信息。记录共享变量的线程交错会产生非常大的日志和很大的减速。因此,最近的研究工作试图执行部分记录,然后使用 SMT 求解器来完成交错的缺失(未记录)部分。
据我所知,该领域的最新进展是一个名为 Symbiosis 的系统。此 URL 中提供了 java/c/c++ 的开源实现(以及测试、示例和已发表的论文):
http://www.gsd.inesc-id.pt/~nmachado/software/Symbiosis_Tutorial.html
希望对您有所帮助。抱歉回复晚了,不过我最近才加入
关于java - 用于测试多线程 Java 应用程序的确定性记录/重放框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20549262/