我想在我的代码中添加几个单元测试,而且当我加载插件时,我并不总是可以访问我正在运行的代码。我真正想检查的测试是我调用的函数是否是无锁的?
是否有任何钩子或方法来测试我的程序中的 A 点和 B 点之间是否调用了非无锁函数?
另一个不太复杂的功能是如何将所有调用挂钩到锁定功能(如锁,系统调用......)。我知道如何在 Windows 上挂接对 malloc 的调用,但仅此而已。
谢谢您的帮助
我想在我的代码中添加几个单元测试,而且当我加载插件时,我并不总是可以访问我正在运行的代码。我真正想检查的测试是我调用的函数是否是无锁的?
是否有任何钩子或方法来测试我的程序中的 A 点和 B 点之间是否调用了非无锁函数?
另一个不太复杂的功能是如何将所有调用挂钩到锁定功能(如锁,系统调用......)。我知道如何在 Windows 上挂接对 malloc 的调用,但仅此而已。
谢谢您的帮助
我很确定如果不对锁或类似的东西进行检测,您将无法做到这一点。
人们可能会想出很多场景,其中锁定函数的调用会导致测试中的不同行为[可能仅在启用“用于识别测试的特殊测试模式”时]而不是在生产代码中 - 例如,添加 100 毫秒的睡眠进入锁定方法,尝试使用另一个锁定功能,并将时间与“没有竞争锁定”进行比较。
或者我们可以保留对锁定的调用计数,并查看函数之前和之后的计数是否相同(或者如果函数应该调用lock
一定次数,则增加了预期的数量)。
但是一种不会侵入锁定机制的通用方式,我很确定这是不可能的。
当然,代码审查和清晰的文档说明哪些代码称为锁,哪些代码不是锁也很有用 - 以及发现错误的优秀审查者。
你不能。
你可以替换一个不同的实现,pthread_lock
但是代码可以直接调用 eg futex
,如果你替换它,代码仍然可以直接调用它syscall(SYS_futex,...)
。您可以分析代码或使用类似的东西strace
来检测所有此类调用,但这仍然不会告诉您代码是否在程序集中实现了自己的自定义自旋锁。
正如其他人已经回答的那样,无法测试算法是否是无锁的。但是,可以测试它在多线程环境中的行为是否一致。我在这方面的经验只是使用无锁队列(我自己写的,但基于一篇学术论文),所以我的测试是基于一个可能对你有用也可能没用的队列。
我使用多个线程进行测试以锤击队列。
在我的测试中,我还改变了读者和作者的数量。队列的行为会根据读者与作者的比例而有所不同。读者多于写者通常会导致队列几乎为空,反之则会导致队列不断扩大,直到写者停止写入。
您可能会感兴趣第 2 点,因为您通常可以根据重负载下响应时间的变化来判断算法是否无锁。如果在重负载下响应时间仍然很快,那么您可以推断该算法是无锁的。或者至少如果不是,它的行为就像是一样。