Valgrind / Memcheck可能非常耗时,导致运行时性能显着下降。我需要一种(在运行时)检测它的方法,以便禁用所有辅助服务和功能,以便在24小时内执行检查。我不希望将任何显式标志传递给程序,但这只是一种方式。
答案 0 :(得分:0)
不确定在Valgrind下运行时采取不同的行为是个好主意,因为Valgrind的目标是在 expected 用例中声明您的软件。
无论如何,Valgrind不会更改堆栈或符号,因为它(有点)模拟了运行程序的CPU。检测您是否正在Valgrind下运行的唯一方法是观察其影响,也就是说,一切都很缓慢并且在Valgrind中不是多线程的。
因此,例如,运行一个测试,该测试生成了3个消耗公共FIFO(带有互斥锁/锁)的线程,并观察了收到的项目数。在实际的CPU中,您希望3个线程在T
时间内处理的项目数量几乎相同,但是在Valgrind下运行时,一个线程将在>>T
时间内消耗几乎所有项目。
另一种可能性是调用某个已知的syscall。 Valgrind对于观察系统调用具有一些规则。例如,如果您正在分配内存,则Valgrind将拦截该内存块,并用一些数据填充该内存区域。在一个好的软件中,您不应该读取该数据并首先对其进行写入(因此要覆盖Valgrind设置的内容)。如果您尝试读取该数据并观察到非零值,则会收到Valgrind invalid read of size XXX
消息,但是您的代码将知道它正在被检测。
最后,(我认为它要简单得多),您应该将需要检测的代码移至库中,并具有2个前端。 “官方”前端,以及一个测试前端,在该前端已禁用了应该在Valgrind下运行的所有功能。