gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:56 26 4
gpt4 key购买 nike

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

  1. 我尝试在符号表中搜索(通过 abi 调用)以查找 valgrind 或 memcheck 符号,但一无所获。
  2. 我尝试检查堆栈(通过 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com