【发布时间】: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 你说得对,我的代码正在使用线程。