【问题标题】:Looking for a way to detect valgrind/memcheck at runtime without including valgrind headers寻找一种在运行时检测 valgrind/memcheck 而不包括 valgrind 标头的方法
【发布时间】:2019-08-31 23:59:51
【问题描述】:

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

  1. 我探索了在符号表(通过 abi 调用)中搜索 valgrind 或 memcheck 符号,但没有。
  2. 我探索了检查堆栈(通过 boost::stacktrace),但那里也没有。

【问题讨论】:

  • 导致程序在被分析时表现不同会破坏执行分析的目的。
  • 添加 valgrind/memcheck 标头有什么问题?
  • 如果您仍然想调整程序的行为,那么使用命令行选项、配置文件或交互式输入来做到这一点是正确的方法,因为这提供了适当的关注点分离。实际上,这意味着您可以分析您选择的一组特性,而不是局限于程序中的特定集合。

标签: c++ c valgrind


【解决方案1】:

不确定在 Valgrind 下运行时具有不同的行为是否是个好主意,因为 Valgrind 的目标是在预期用例中断言您的软件。

无论如何,Valgrind 不会更改堆栈或符号,因为它(某种程度上)模拟了运行您的程序的 CPU。检测你是否在 Valgrind 下运行的唯一方法是观察它的影响,也就是说,在 Valgrind 中一切都很慢而且不是多线程的。

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

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

最后,(我认为它更简单),您应该将需要检测的代码移到库中,并拥有 2 个前端。 “官方”前端,以及一个测试前端,你已经禁用了所有应该在 Valgrind 下运行的花里胡哨。

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 2020-12-14
    • 2014-04-08
    • 1970-01-01
    • 2013-02-26
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多