2017-05-30 57 views
-3

当内存调试使用Valgrind因为我通过了以下错误迎来了通常的原因我的程序(有很多人):奇怪的valgrind错误

==9895== Invalid read of size 4 
==9895== at 0x10D6C1: Shell (vshell.c:903) 
==9895== by 0x113608: exec_wrap (vib.c:111) 
==9895== by 0x111E8A: sm_thread (vproc.c:123) 
==9895== by 0x1107EC: tstart (vsched.c:130) 
==9895== by 0x55B3A8F: ??? (in /lib/x86_64-linux-gnu/libc-2.24.so) 
==9895== Address 0x5973e90 is 134,800 bytes inside a block of size 135,168 alloc'd 
==9895== at 0x4C300B6: memalign (vg_replace_malloc.c:858) 
==9895== by 0x1106D0: alloc_thread (vsched.c:95) 
==9895== by 0x110825: sthread (vsched.c:144) 
==9895== by 0x112030: Exec (mproc.c:183) 
==9895== by 0x1137D9: Execute (vlib.c:166) 
==9895== by 0x10D9A5: bshell (shell.c:965) 
==9895== by 0x111E8A: smain_thread (mproc.c:123) 
==9895== by 0x1107EC: tstart (vsched.c:130) 
==9895== by 0x55B3A8F: ??? (in /lib/x86_64-linux-gnu/libc-2.24.so) 

探测通常的地方(如在这里,Valgrind“ s手册和谷歌)没有产生任何见解,为什么会发生这种情况。据我了解,从错误消息分配的块是大于比地址指的是,所以我不明白“抱怨”。正如我最初所说的那样,有许多消息完全像这样,但代码的不同部分 - 这只是一个指示性错误。值得注意的是,当程序退出时没有实际的泄漏,按照Valgrind - 只是这些错误。任何人都可以提供任何见解,为什么发生这种情况?

+2

“大小4的读取无效”意味着您尝试读取尚未分配内存的32位值。在32位系统上,它可能是一个指针,否则可能是你取消引用未初始化的指针来读取“int”。或类似的东西。梳理你的代码来寻找未初始化的局部变量。此外,构建启用了许多警告,并修复您获得的所有警告。 –

+0

看起来您正在从您从未写过的内存中读取数据,并且您正在从奇数内存地址读取一个4字节值。 –

+0

什么是源代码?你可以尝试使用gdb服务器吗? –

回答

0

Address 0x5973e90 is 134,800 bytes inside a block of size 135,168 alloc'd 显然比需要在地址0x5973e90 你分配较少的内存有几乎没有与你的程序帮助,当你没有提供任何代码的方式。检查您的分配,如果大小匹配所需的。

+0

我认为你对此不正确;从Valgrind的文档和相关的答案像[this](https://stackoverflow.com/questions/7662008/valgrind-giving-error-but-everything-seems-fine)或在Valgrind的论坛[这个] (https://sourceforge.net/p/valgrind/mailman/message/23179379/)都表示分配的块的大小由右值表示,在我的情况下为135,168,而其他块大小由左值表示,这里是134,800 - 所以它*少*。此外,给出的读取错误不是*之前的*或*之后,这会导致流量不足或过大。无论如何,谢谢。 – jtimz