寻找一种在运行时检测valgrind / memcheck而不包括valgrind头的方法

问题描述 投票:5回答:1

Valgrind / Memcheck可能非常密集,导致运行时性能显着下降。我需要一种方法(在运行时)来检测它,以便禁用所有辅助服务和功能,以便在24小时内执行检查。我宁愿不将任何明确的标志传递给程序,但这将是一种方式。

  1. 我探索了搜索符号表(通过abi调用)获取valgrind或memcheck符号,但没有。
  2. 我探索了检查堆栈(通过boost :: stacktrace),但也没有任何东西。
c++ c valgrind
1个回答
0
投票

不确定在Valgrind下运行时有不同的行为,因为Valgrind的目标是在预期的使用情况下断言您的软件。

无论如何,Valgrind不会更改堆栈或符号,因为它(类型)模拟运行程序的CPU。检测你是否在Valgrind下运行的唯一方法是观察其效果,即Valgrind中的一切都很慢而不是多线程。

因此,例如,运行一个测试,该测试产生3个消耗共同FIFO(带有互斥锁/锁)的线程,并观察收到的项目数。在真正的CPU中,你期望3个线程在T时间内处理接近相同数量的项目,但是当在Valgrind下运行时,一个线程将消耗>>T时间内的几乎所有项目。

另一种可能性是调用一些已知的系统调用。 Valgrind有一些观察系统调用的规则。例如,如果要分配内存,那么Valgrind将拦截这个内存块,并用一些数据填充该内存区域。在一个好的软件中,你不应该读取该数据并首先写入它(因此覆盖Valgrind设置的内容)。如果您尝试读取该数据并观察非零值,您将获得Valgrind invalid read of size XXX消息,但您的代码将知道它正在被检测。

最后,(我认为它更简单),你应该移动你需要在库中仪器的代码,并有2个前端。 “正式”的前端,以及一个测试前端,你已经禁用了所有应该在Valgrind下运行的铃声和口哨声。

© www.soinside.com 2019 - 2024. All rights reserved.