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

标签 c++ c valgrind

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/

相关文章:

c++ - 在 C++ 中按升序对数组集进行排序

c++ - 如何在编译时标记默认参数的所有使用

c++ - 使用带参数的 Boost::Thread 时出现编译器错误

c - 如何传递用户在函数中定义其维度的矩阵

c++ - Azure IOTHub - 与 C SDK 的 HTTPS 连接中的证书参数(文件路径)

c - mmap 和 valgrind,mmap 不会增加堆大小

Windows 服务中可能使用 C++ SendInput 吗?

c - 请求成员 .. 不是结构

c - Valgrind 给出错误 : "Conditional jump or move depends on uninitialised value(s)"

memory-leaks - Valgrind 显示内存泄漏,但没有发生内存分配