Dominique Pellé wrote:
> Bram Moolenaar wrote:
>
>>> Besides the test failure, several testdir/valgrind.* files
>>> show memory leaks, despite having built Vim with
>>> -DEXIT_FREE. For example, in valgrind.test_alot, I see:
>>
>> test_alot is a collection of tests. Can you run them separately to
>> isolate the one(s) that causes the leak?
>
> I have not spent a lot of time on this yet. I'll spend more time later.
> But this is enough to reproduce leaks (vim built with -DEXITFREE):
>
> # Build vim with -DEXITFREE...
> $ git diff Makefile
> diff --git a/src/Makefile b/src/Makefile
> index 001f87a..21fef20 100644
> --- a/src/Makefile
> +++ b/src/Makefile
> @@ -667,7 +667,7 @@ SANITIZER_LIBS = $(SANITIZER_CFLAGS)
> # Configuration is in the .ccmalloc or ~/.ccmalloc file.
> # Doesn't work very well, since memory linked to from global variables
> # (in libraries) is also marked as leaked memory.
> -#LEAK_CFLAGS = -DEXITFREE
> +LEAK_CFLAGS = -DEXITFREE
> #LEAK_LIBS = -lccmalloc
>
> #####################################################
>
>
>
> $ ./configure --with-features=huge --enable-gui=none
> $ make
> $ cd src/testdir
> $ valgrind --leak-check=yes ../vim -u NONE -N \
> -S test_partial.vim -c 'call Test_job_start_fails()' -c q 2> log
>
> And log file contains:
>
> ==6856== Memcheck, a memory error detector
> ==6856== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
> ==6856== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
> ==6856== Command: ../vim -u NONE -N -S test_partial.vim -c call\
> Test_job_start_fails() -c q
> ==6856==
> ==6857==
> ==6857== HEAP SUMMARY:
> ==6857== in use at exit: 350,433 bytes in 1,828 blocks
> ==6857== total heap usage: 7,668 allocs, 5,840 frees, 844,057 bytes
> allocated
> ==6857==
> ==6857== 99 bytes in 19 blocks are possibly lost in loss record 249 of 379
> ==6857== at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6857== by 0x4C1E2B: lalloc (misc2.c:920)
> ==6857== by 0x4C26CD: alloc (misc2.c:818)
> ==6857== by 0x4C26CD: vim_strsave (misc2.c:1256)
> ==6857== by 0x57AD1B: get_function_args (userfunc.c:207)
> ==6857== by 0x57DC42: ex_function (userfunc.c:1865)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x45C281: do_source (ex_cmds2.c:3975)
> ==6857== by 0x45CCEB: cmd_source (ex_cmds2.c:3588)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x408571: exe_commands (main.c:2893)
> ==6857== by 0x408571: main (main.c:778)
> ==6857==
> ==6857== 192 bytes in 8 blocks are possibly lost in loss record 281 of 379
> ==6857== at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6857== by 0x4C1E2B: lalloc (misc2.c:920)
> ==6857== by 0x4C2F43: alloc (misc2.c:818)
> ==6857== by 0x4C2F43: ga_grow (misc2.c:2009)
> ==6857== by 0x57AD07: get_function_args (userfunc.c:201)
> ==6857== by 0x57DC42: ex_function (userfunc.c:1865)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x45C281: do_source (ex_cmds2.c:3975)
> ==6857== by 0x45CCEB: cmd_source (ex_cmds2.c:3588)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x408571: exe_commands (main.c:2893)
> ==6857== by 0x408571: main (main.c:778)
> ==6857==
> ==6857== 216 bytes in 9 blocks are possibly lost in loss record 287 of 379
> ==6857== at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6857== by 0x4C1E2B: lalloc (misc2.c:920)
> ==6857== by 0x4C2F43: alloc (misc2.c:818)
> ==6857== by 0x4C2F43: ga_grow (misc2.c:2009)
> ==6857== by 0x57DF1A: ex_function (userfunc.c:2047)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x45C281: do_source (ex_cmds2.c:3975)
> ==6857== by 0x45CCEB: cmd_source (ex_cmds2.c:3588)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x408571: exe_commands (main.c:2893)
> ==6857== by 0x408571: main (main.c:778)
> ==6857==
> ==6857== 2,448 bytes in 19 blocks are possibly lost in loss record 350 of 379
> ==6857== at 0x4C2CE8E: realloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6857== by 0x4C2EF0: ga_grow (misc2.c:2009)
> ==6857== by 0x57DF1A: ex_function (userfunc.c:2047)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x45C281: do_source (ex_cmds2.c:3975)
> ==6857== by 0x45CCEB: cmd_source (ex_cmds2.c:3588)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x408571: exe_commands (main.c:2893)
> ==6857== by 0x408571: main (main.c:778)
> ==6857==
> ==6857== 6,752 bytes in 29 blocks are possibly lost in loss record 365 of 379
> ==6857== at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6857== by 0x4C1E2B: lalloc (misc2.c:920)
> ==6857== by 0x57E784: ex_function (userfunc.c:2175)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x45C281: do_source (ex_cmds2.c:3975)
> ==6857== by 0x45CCEB: cmd_source (ex_cmds2.c:3588)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x408571: exe_commands (main.c:2893)
> ==6857== by 0x408571: main (main.c:778)
> ==6857==
> ==6857== 9,265 bytes in 293 blocks are possibly lost in loss record 372 of 379
> ==6857== at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6857== by 0x4C1E2B: lalloc (misc2.c:920)
> ==6857== by 0x4C26CD: alloc (misc2.c:818)
> ==6857== by 0x4C26CD: vim_strsave (misc2.c:1256)
> ==6857== by 0x57DF2A: ex_function (userfunc.c:2057)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x45C281: do_source (ex_cmds2.c:3975)
> ==6857== by 0x45CCEB: cmd_source (ex_cmds2.c:3588)
> ==6857== by 0x467D0C: do_one_cmd (ex_docmd.c:2925)
> ==6857== by 0x467D0C: do_cmdline (ex_docmd.c:1110)
> ==6857== by 0x408571: exe_commands (main.c:2893)
> ==6857== by 0x408571: main (main.c:778)
> ==6857==
> ==6857== LEAK SUMMARY:
> ==6857== definitely lost: 0 bytes in 0 blocks
> ==6857== indirectly lost: 0 bytes in 0 blocks
> ==6857== possibly lost: 18,972 bytes in 377 blocks
> ==6857== still reachable: 331,461 bytes in 1,451 blocks
> ==6857== suppressed: 0 bytes in 0 blocks
> ==6857== Reachable blocks (those to which a pointer was found) are not shown.
> ==6857== To see them, rerun with: --leak-check=full --show-leak-kinds=all
> ==6857==
> ==6857== For counts of detected and suppressed errors, rerun with: -v
> ==6857== ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0)
> ==6856==
> ==6856== HEAP SUMMARY:
> ==6856== in use at exit: 108,951 bytes in 429 blocks
> ==6856== total heap usage: 7,902 allocs, 7,473 frees, 866,261 bytes
> allocated
> ==6856==
> ==6856== 652 (520 direct, 132 indirect) bytes in 1 blocks are
> definitely lost in loss record 110 of 132
> ==6856== at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6856== by 0x526E8A8: XtMalloc (in
> /usr/lib/x86_64-linux-gnu/libXt.so.6.0.0)
> ==6856== by 0x5277250: ??? (in /usr/lib/x86_64-linux-gnu/libXt.so.6.0.0)
> ==6856== by 0x5277303: ??? (in /usr/lib/x86_64-linux-gnu/libXt.so.6.0.0)
> ==6856== by 0x5277E61: _XtAppCreateShell (in
> /usr/lib/x86_64-linux-gnu/libXt.so.6.0.0)
> ==6856== by 0x52A5C73: XtVaAppCreateShell (in
> /usr/lib/x86_64-linux-gnu/libXt.so.6.0.0)
> ==6856== by 0x4F8533: setup_term_clip (os_unix.c:6991)
> ==6856== by 0x407CDE: main (main.c:611)
> ==6856==
> ==6856== 1,688 (136 direct, 1,552 indirect) bytes in 1 blocks are
> definitely lost in loss record 120 of 132
> ==6856== at 0x4C2CE8E: realloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6856== by 0x550F0FD: ??? (in /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x550F657: ??? (in /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x5510F04: ??? (in /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x55116BB: _XlcCreateLC (in
> /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x55319CF: _XlcUtf8Loader (in
> /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x5518C4D: _XOpenLC (in
> /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x5518E7A: _XrmInitParseInfo (in
> /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x550153F: ??? (in /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x550490D: XrmGetStringDatabase (in
> /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x5281495: ??? (in /usr/lib/x86_64-linux-gnu/libXt.so.6.0.0)
> ==6856== by 0x5282952: _XtDisplayInitialize (in
> /usr/lib/x86_64-linux-gnu/libXt.so.6.0.0)
> ==6856==
> ==6856== 46,694 (4,680 direct, 42,014 indirect) bytes in 1 blocks are
> definitely lost in loss record 132 of 132
> ==6856== at 0x4C2CC70: calloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6856== by 0x54ED85A: XOpenDisplay (in
> /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)
> ==6856== by 0x4F541A: get_x11_windis (os_unix.c:1835)
> ==6856== by 0x4F5516: get_x11_thing (os_unix.c:1914)
> ==6856== by 0x4E9AC4: set_title_defaults (option.c:4127)
> ==6856== by 0x407C1A: main (main.c:491)
> ==6856==
> ==6856== LEAK SUMMARY:
> ==6856== definitely lost: 5,336 bytes in 3 blocks
> ==6856== indirectly lost: 43,698 bytes in 64 blocks
> ==6856== possibly lost: 0 bytes in 0 blocks
> ==6856== still reachable: 59,917 bytes in 362 blocks
> ==6856== suppressed: 0 bytes in 0 blocks
> ==6856== Reachable blocks (those to which a pointer was found) are not shown.
> ==6856== To see them, rerun with: --leak-check=full --show-leak-kinds=all
> ==6856==
> ==6856== For counts of detected and suppressed errors, rerun with: -v
> ==6856== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
About above leaks: I think that that the following comment in mch_start_job(...)
at os_unix.c:5215 explains why they happen:
os_unix.c:
5128 pid = fork(); /* maybe we should use vfork() */
5129 if (pid == -1)
5130 {
5131 /* failed to fork */
5132 goto failed;
5133 }
5134
5135 if (pid == 0)
5136 {
....
!!5214 #ifdef EXITFREE
!!5215 /* calling free_all_mem() here causes problems. Ignore valgrind
!!5216 * reporting possibly leaked memory. */
!!5217 #endif
5218 _exit(EXEC_FAILED); /* exec failed, return
failure code */
5219 }
The child process of fork(...) does not call free_all_mem().
It's probably not a real leak if it's just about not calling free_all_mem()
before exiting.
Now about the issue with test_netbeans.vim failing when tests are run
with valgrind, I still don't know why it happens.
Regards
Dominique
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.