Valgrind/Memcheck 可能很密集,会导致运行时性能显着下降。我需要一种方法(在运行时)检测它,以便禁用所有辅助服务和功能,以便在 24 小时内执行检查。我不希望将任何显式标志传递给程序,但那是一种方式。
- 我尝试在符号表中搜索(通过 abi 调用)以查找 valgrind 或 memcheck 符号,但一无所获。
- 我尝试检查堆栈(通过 boost::stacktrace),但那里也什么也没有。
最佳答案
不确定在 Valgrind 下运行时有不同的行为是个好主意,因为 Valgrind 的目标是在预期使用情况下断言您的软件。
无论如何,Valgrind 不会更改堆栈或符号,因为它(某种程度上)模拟了运行您程序的 CPU。检测你是否在 Valgrind 下运行的唯一方法是观察它的影响,也就是说,在 Valgrind 中一切都很慢而且不是多线程的。
因此,例如,运行一个测试生成 3 个线程使用一个公共(public) FIFO(带有互斥锁/锁)并观察接收到的项目数。在真实的 CPU 中,您会期望 3 个线程在 T
时间内处理了接近相同数量的项目,但是当在 Valgrind 下运行时,一个线程将消耗掉 中的几乎所有项目>>T
时间。
另一种可能性是调用某个已知的系统调用。 Valgrind 有一些观察 系统调用的规则。例如,如果您正在分配内存,那么 Valgrind 将拦截这 block 内存,并用一些数据填充该内存区域。在一个好的软件中,您不应该读取该数据并先写入它(因此会覆盖 Valgrind 设置的内容)。如果您尝试读取该数据并观察到非零值,您将收到 Valgrind invalid read of size XXX
消息,但您的代码会知道它正在检测。
最后,(我认为它更简单),您应该将需要检测的代码移到一个库中,并拥有 2 个前端。 “官方”前端和一个测试前端,您已在其中禁用了本应在 Valgrind 下运行的所有附加功能。
关于c++ - 寻找一种在运行时检测 valgrind/memcheck 而不包括 valgrind header 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55614036/