valgrind memcheck在一个rw-anonymous片段中给出了消息""

时间:2017-12-20 00:01:13

标签: c++ linux valgrind memcheck massif

我使用massif来调试堆增加问题的二进制程序运行很长时间。但它报告说:

valgrind: m_mallocfree.c:280 (mk_plain_bszB): Assertion 'bszB != 0' failed.
valgrind: This is probably caused by your program erroneously writing past the
end of a heap block and corrupting heap metadata.  If you fix any
invalid writes reported by Memcheck, this assertion failure will
probably go away.  Please try that before reporting this as a bug.
host stacktrace:
==21766==    at 0x58007769: show_sched_status_wrk (in /usr/lib64/valgrind/massif-amd64-linux)
==21766==    by 0x58007A44: report_and_quit (in /usr/lib64/valgrind/massif-amd64-linux)
==21766==    by 0x58007C77: vgPlain_assert_fail (in /usr/lib64/valgrind/massif-amd64-linux)
==21766==    by 0x58013D01: vgPlain_arena_free (in /usr/lib64/valgrind/massif-amd64-linux)
==21766==    by 0x5805CAE2: do_client_request (in /usr/lib64/valgrind/massif-amd64-linux)
==21766==    by 0x5805DCFE: vgPlain_scheduler (in /usr/lib64/valgrind/massif-amd64-linux)
==21766==    by 0x58011560: final_tidyup (in /usr/lib64/valgrind/massif-amd64-linux)
==21766==    by 0x5801191B: shutdown_actions_NORETURN (in /usr/lib64/valgrind/massif-amd64-linux)
==21766==    by 0x5808F42C: run_a_thread_NORETURN (in /usr/lib64/valgrind/massif-amd64-linux)

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable (lwpid 21766)
==21766==    at 0x4A06F16: free (vg_replace_malloc.c:529)
==21766==    by 0x3CD630C24A: free_mem (in /lib64/libc-2.5.so)
==21766==    by 0x3CD630BE41: __libc_freeres (in /lib64/libc-2.5.so)
==21766==    by 0x480368A: _vgnU_freeres (vg_preloaded.c:77)
==21766==    by 0x3CD6233224: exit (exit.c:90)
==21766==    by 0x3CD621D9FA: (below main) (libc-start.c:262)

所以我尝试了valgrind --tool = memcheck -v,然后报告:

==21789== HEAP SUMMARY:
==21789==     in use at exit: 0 bytes in 0 blocks
==21789==   total heap usage: 7,015 allocs, 7,016 frees, 805,222 bytes allocated
==21789==
==21789== All heap blocks were freed -- no leaks are possible
==21789==
==21789== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 4)
==21789==
==21789== 1 errors in context 1 of 1:
==21789== Invalid free() / delete / delete[] / realloc()
==21789==    at 0x4A08B56: free (vg_replace_malloc.c:529)
==21789==    by 0x3CD630C24A: free_mem (in /lib64/libc-2.5.so)
==21789==    by 0x3CD630BE41: __libc_freeres (in /lib64/libc-2.5.so)
==21789==    by 0x480368A: _vgnU_freeres (vg_preloaded.c:77)
==21789==    by 0x3CD6233224: exit (exit.c:90)
==21789==    by 0x3CD621D9FA: (below main) (libc-start.c:262)
==21789==  Address 0x6374c98 is in a rw- anonymous segment
==21789==
--21789--
--21789-- used_suppression:      6 dl-hack3 /usr/lib64/valgrind/default.supp:1239
==21789==
==21789== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 4)

我不知道主要的错误。

1 个答案:

答案 0 :(得分:1)

对于替换malloc / free / ..(例如memcheck和massif)的工具,valgrind默认运行glibc提供的函数释放为例如分配的内存。 c ++运行时或一些glibc /动态加载器数据 结构。 这样可以使内存无泄漏。报告。然而,看起来glibc清洁工试图释放一些由valgrind没有拦截的东西分配的内存(可能是一个过早的分配?这个还不清楚)。

要做的两件事:

  • 使用--run-libc-freeres = no --run-cxx-freeres = no运行以绕过问题。 (然后你可能会看到memcheck抱怨仍然分配了一些内存)
  • 在valgrind bugzilla上提交有关上述内容的错误,并提供所有内容 需要的细节,如gcc版本,glibc版本,发行版,valgrind版本......