我想知道是否可以使用调试器自动测试竞态条件。模拟gdb/lldb的竞态条件是否可行?
例如,您想要测试多线程队列的映像。在其他人中,你会想测试一下,你可以同时拨打enqueue()
和dequeue()
。
一个简单的单元测试也可以启动两个线程,每个线程调用enqueue()
和环型dequeue()
分别检查结果:
// thread A
for(int i=0; i<count; i+=1) {
enqueue(queue, i);
}
// thread B
for(int i=0; i<count; i+=1) {
ASSERT(i == dequeue(queue));
}
现在,一个聪明的测试驾驶员,运行单位 - 测试gdb
或lldb
,应该能够等待两个循环内设置的断点,然后使用调试器si
(分步指令)命令来模拟两个线程的所有可能的交错。
我的问题是,如果这在技术上是可能的(它是)。我想知道的是:
假设enqueue()
函数有10条指令,而dequeue()
函数有20条 - 测试需要尝试多少次不同的交错?
哇,非常感谢!这正是我想知道的。另外,这个例子特别有用(看你如何将大写字母移到前面,这很容易理解模式)。 – svckr 2013-03-22 11:06:26
没问题。只是添加了参考程序。 – 2013-03-22 11:47:12