【问题标题】:C++ binary is perfectly executing while running with valgrind but failing when run this binary aloneC++ 二进制文件在使用 valgrind 运行时完美执行,但在单独运行此二进制文件时失败
【发布时间】:2013-07-04 10:53:57
【问题描述】:

当我使用以下命令运行此二进制文件时,我有一个 C++ 可执行文件

valgrind -v --leak-check=full --show-reachable=yes --track-origins=yes mybinary -mode init > 5.log 2>&1

它以0退出,并生成所有输出文件。

但是当我像

一样运行这个二进制文件时
mybinary -mode init > 5.log 2>&1

在很多地方都是核心转储(一个接一个)。

为什么当我使用 valgrind 运行时行为会发生变化? valgrind 是否设置任何内部环境变量?

【问题讨论】:

  • valgrind 日志是怎么说的?
  • 信息如此之少,我们只能猜测。我的是,您的程序表现出未定义的行为,并且它在valgrind 下运行时似乎可以工作的事实只是机会。
  • 在很多地方dump cores表示它要么是多线程的,要么是使用fork的,这意味着运行valgrind时的时间会有所不同(这也可能在某些方面同步事情,因为我确定它有一些锁以防止它自己打结)。寻找竞争条件,并分析您的核心转储以尝试了解它的去向。
  • 这里是 valgrind 输出 ==17831== 413 的上下文 304 中的 2554 个错误:==17831== 条件跳转或移动取决于未初始化的值 ==17831== 0x38CAA077F0: start_thread (in /lib64/libpthread-2.12.so) ==17831== 未初始化的值是由堆分配创建的 ==17831== 在 0x4A06C8E: operator new(unsigned long) (vg_replace_malloc.c:261) ==17831= = by 0x38CAA077F0: start_thread (in /lib64/libpthread-2.12.so)
  • @Mats petersson 你说得对,我的代码正在使用线程。

标签: c++ valgrind


【解决方案1】:

正如 Valgrind 手册 says

Valgrind 将执行序列化,以便一次只运行一个(内核)线程。 [...] 您的程序在 Valgrind 上运行时会看到与正常运行时非常不同的调度。这既是因为 Valgrind 正在序列化线程,也是因为代码运行速度比正常慢得多。

另外,您正在运行默认的 Valgrind 工具 memcheck。您可以尝试使用任何以线程为中心的工具,例如 helgrind 或 DRD,以获得有关并发问题的特定信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多