valgrind和常规c ++ run之间有什么区别

时间:2011-08-17 17:15:13

标签: c++ debugging valgrind

我正在尝试识别我获得seg的bug in I have in my code。尝试将值分配给来自向量的指针时出错(在链接中描述得更好)。当我使用valgrind运行代码时,我没有得到seg.fault。

valgrind做的不同。我认为我需要考虑valgrind会话和常规c ++会话之间的内存管理差异,但我真的不知道

4 个答案:

答案 0 :(得分:4)

来自Valgrind FAQ

  

4.4。我的程序正常崩溃,但不是Valgrind,或副   反之亦然。发生了什么?

     

当一个程序在Valgrind下运行时,它的环境是轻微的   不同于它本地运行时。例如,内存布局是   不同,线程的安排方式也不同。

     

大部分时间这没有任何区别,但它可以,   特别是如果你的程序是错误的。例如,如果你的程序   崩溃,因为它错误地访问了无法寻址的内存,   运行时,这个内存可能不会无法寻址   在Valgrind。或者,如果您的程序有数据竞争,那么这些   可能不会在Valgrind下出现。

     

没有任何东西可以改变这一点,这只是性质   Valgrind的工作方式,它不能完全复制本机   执行环境。如果您的程序因a而崩溃   本机运行时的内存错误,但在Valgrind下运行时没有   大多数情况下Memcheck应该识别坏内存操作。

所以你无关紧要。实际上你不必担心你在Valgrind下编程不会崩溃。您应该从中读取错误消息并修复它们。从Invalid read/Invalid write errors开始。它们几乎总是在代码中指出错误。在这种特殊情况下,您还可以在简单的bash脚本中以无限循环运行代码,直到它产生错误消息。很可能你正在处理无效的迭代器,它在C ++中是未定义的行为

答案 1 :(得分:0)

也许问题可能与时间有关,当您使用valgrind运行代码时,运行速度会慢一点,因为valgrind会在运行时收集并诊断您的代码。

答案 2 :(得分:0)

Valgrind会跟踪您的程序内存使用情况。这是它告诉你泄漏的方式。这意味着它劫持malloc等等并使用它自己,以便它可以实现这一点。这意味着,当您正常运行代码时,您可能会读/写一些您意外释放的数据导致段错误,而valgrind可能会保留这些内存以查看它是否真的丢失等因此意味着(运气)内存仍然有效。只是一个猜测。

答案 3 :(得分:0)

Valgrind在虚拟CPU上运行程序,也就是说,它在软件中执行每个汇编指令(除了内核调用)。多线程程序被序列化,即只有一个执行线程一次进行。

如果您的应用程序是多线程的,当它在valgrind竞争条件下执行时,线程序列化可能会掩盖缺少同步,因此不会发现此类错误的影响。