我正在尝试识别我获得seg的bug in I have in my code。尝试将值分配给来自向量的指针时出错(在链接中描述得更好)。当我使用valgrind运行代码时,我没有得到seg.fault。
valgrind做的不同。我认为我需要考虑valgrind会话和常规c ++会话之间的内存管理差异,但我真的不知道
答案 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竞争条件下执行时,线程序列化可能会掩盖缺少同步,因此不会发现此类错误的影响。