Valgrind压痕(以下主要)

时间:2012-06-15 16:43:18

标签: c malloc free valgrind

以下是项目的valgrind输出:

==2433== Invalid free() / delete / delete[] / realloc()
==2433==    at 0x402B06C: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2433==    by 0x43F345B: av_freep (mem.c:172)
==2433==    by 0x5A6F4D2: (below main) (libc-start.c:226)
==2433==  Address 0xb3fd830 is 48 bytes inside a block of size 111,634 alloc'd
==2433==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2433==    by 0x80BB6B5: _talloc_realloc (talloc.c:997)

与以Address开头的行相比,以Invalid开头的行缩进了一个空格。这是否意味着一个导致另一个?或者他们是分开的吗?

如果是单独的,那么by 0x5A6F4D2: (below main) (libc-start.c:226)来自哪里?我感觉(below main)与它有关,但我在硬盘上找不到libc-start.c。

2 个答案:

答案 0 :(得分:2)

是的,它为您提供有关无效免费的其他详细信息。前四行描述了无效调用(在本例中为free)和free时的调用栈。以下三行提供了额外的数据。在这种情况下,valgrind会识别传递给free的地址包含在已分配的区域中,并提供该分配的偏移量,块大小和调用堆栈。

答案 1 :(得分:1)

根据valgrind.org,层次结构应该是平的,如下所示:

==3016== Invalid write of size 1
==3016==    at 0x80484DA: main (in /jfs/article/sample2)
==3016==    by 0x40271507: __libc_start_main (../sysdeps/generic/libc-start.c:129)
==3016==    by 0x80483B1: free@@GLIBC_2.0 (in /jfs/article/sample2)
==3016==    Address 0x40CA0224 is 0 bytes after a block of size 512 alloc'd
==3016==    at 0x400483E4: malloc (vg_clientfuncs.c:100)
==3016==    by 0x80484AA: main (in /jfs/article/sample2)
==3016==    by 0x40271507: __libc_start_main (../sysdeps/generic/libc-start.c:129)
==3016==    by 0x80483B1: free@@GLIBC_2.0 (in /jfs/article/sample2)

我会在输出中将Address的缩进视为上述内容,因为它可能是特定于版本的更改,以使输出更具可读性。