V8::Dispose() Segmentation fault

170 views
Skip to first unread message

David Wardell

unread,
Apr 20, 2014, 8:45:24 PM4/20/14
to v8-u...@googlegroups.com
Hi all.

I tried to research the topic first, so if it has already been posted please forgive me.

Running Linux on x64 and I can use V8 (which I built from source) just fine. However, when I run the hello_world code provided here against valgrid I find memory leaks:


==4240== Memcheck, a memory error detector
==4240== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==4240== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==4240== Command: ./hello_world
==4240== 
==4240== Warning: set address range perms: large range [0x20ad2ae19000, 0x20ad4ae19000) (noaccess)
Hello, World!
==4240== 
==4240== HEAP SUMMARY:
==4240==     in use at exit: 331,256 bytes in 162 blocks
==4240==   total heap usage: 272 allocs, 110 frees, 1,034,898 bytes allocated
==4240== 
==4240== 104 bytes in 1 blocks are possibly lost in loss record 88 of 142
==4240==    at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4240==    by 0x465090: v8::internal::Debugger::Debugger(v8::internal::Isolate*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x575514: v8::internal::Isolate::Init(v8::internal::Deserializer*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x6B48D0: v8::internal::Snapshot::Initialize(char const*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x406CEE: v8::EnsureInitializedForIsolate(v8::internal::Isolate*, char const*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x4182E3: v8::Context::New(v8::Isolate*, v8::ExtensionConfiguration*, v8::Handle<v8::ObjectTemplate>, v8::Handle<v8::Value>) (in /home/david/opt/v8/hello_world)
==4240==    by 0x40501A: main (in /home/david/opt/v8/hello_world)
==4240== 
==4240== 104 bytes in 1 blocks are possibly lost in loss record 89 of 142
==4240==    at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4240==    by 0x465157: v8::internal::Debugger::Debugger(v8::internal::Isolate*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x575514: v8::internal::Isolate::Init(v8::internal::Deserializer*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x6B48D0: v8::internal::Snapshot::Initialize(char const*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x406CEE: v8::EnsureInitializedForIsolate(v8::internal::Isolate*, char const*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x4182E3: v8::Context::New(v8::Isolate*, v8::ExtensionConfiguration*, v8::Handle<v8::ObjectTemplate>, v8::Handle<v8::Value>) (in /home/david/opt/v8/hello_world)
==4240==    by 0x40501A: main (in /home/david/opt/v8/hello_world)
==4240== 
==4240== 288 bytes in 1 blocks are possibly lost in loss record 106 of 142
==4240==    at 0x4C2CC70: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4240==    by 0x4012E54: _dl_allocate_tls (dl-tls.c:296)
==4240==    by 0x5047DA0: pthread_create@@GLIBC_2.2.5 (allocatestack.c:589)
==4240==    by 0x7768A4: v8::internal::Thread::Start() (in /home/david/opt/v8/hello_world)
==4240==    by 0x5756C9: v8::internal::Isolate::Init(v8::internal::Deserializer*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x6B48D0: v8::internal::Snapshot::Initialize(char const*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x406CEE: v8::EnsureInitializedForIsolate(v8::internal::Isolate*, char const*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x4182E3: v8::Context::New(v8::Isolate*, v8::ExtensionConfiguration*, v8::Handle<v8::ObjectTemplate>, v8::Handle<v8::Value>) (in /home/david/opt/v8/hello_world)
==4240==    by 0x40501A: main (in /home/david/opt/v8/hello_world)
==4240== 
==4240== 576 bytes in 2 blocks are possibly lost in loss record 121 of 142
==4240==    at 0x4C2CC70: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4240==    by 0x4012E54: _dl_allocate_tls (dl-tls.c:296)
==4240==    by 0x5047DA0: pthread_create@@GLIBC_2.2.5 (allocatestack.c:589)
==4240==    by 0x7768A4: v8::internal::Thread::Start() (in /home/david/opt/v8/hello_world)
==4240==    by 0x57526A: v8::internal::Isolate::Init(v8::internal::Deserializer*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x6B48D0: v8::internal::Snapshot::Initialize(char const*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x406CEE: v8::EnsureInitializedForIsolate(v8::internal::Isolate*, char const*) (in /home/david/opt/v8/hello_world)
==4240==    by 0x4182E3: v8::Context::New(v8::Isolate*, v8::ExtensionConfiguration*, v8::Handle<v8::ObjectTemplate>, v8::Handle<v8::Value>) (in /home/david/opt/v8/hello_world)
==4240==    by 0x40501A: main (in /home/david/opt/v8/hello_world)
==4240== 
==4240== LEAK SUMMARY:
==4240==    definitely lost: 0 bytes in 0 blocks
==4240==    indirectly lost: 0 bytes in 0 blocks
==4240==      possibly lost: 1,072 bytes in 5 blocks
==4240==    still reachable: 330,184 bytes in 157 blocks
==4240==         suppressed: 0 bytes in 0 blocks
==4240== Reachable blocks (those to which a pointer was found) are not shown.
==4240== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==4240== 
==4240== For counts of detected and suppressed errors, rerun with: -v
==4240== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0)


I researched and found this post which describes the issue (with win32) and how he mostly solved it with V8::Dispose().

However, whenever I run the hello_world program with Dispose() (as the last function called in the program) it causes a segmentation fault. It seems to be seg-faulting after the call to Dispose() returns (I assume some destructor is attempting to access memory cleaned up by Dispose()).

What am I doing wrong?

Thanks for any help.

Ben Noordhuis

unread,
Apr 21, 2014, 3:07:36 PM4/21/14
to v8-u...@googlegroups.com
If you're using something like Context::Scope, make sure that the
object is properly scoped, i.e. that it is destructed before you call
V8::Dispose().

If it's not that, try a debug build. It has a ton more checks, that
will usually help flush out the bug.

David Wardell

unread,
Apr 21, 2014, 5:15:59 PM4/21/14
to v8-u...@googlegroups.com
You are a genius.

I simply placed all the objects (excluding the Isolate) in a sub-block and then called dispose after this sub-block (thus forcing the other objects' destructors before the call to Dispose()).

It even got rid of all the memory leak issues with valgrind.

Any explanation on what was going on underneath (or better yet a link explaining whats going on under the hood)? Thank you.



--
--
v8-users mailing list
v8-u...@googlegroups.com
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to a topic in the Google Groups "v8-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/v8-users/1o_5qrOeOKU/unsubscribe.
To unsubscribe from this group and all its topics, send an email to v8-users+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Ben Noordhuis

unread,
Apr 22, 2014, 12:01:41 PM4/22/14
to v8-u...@googlegroups.com
On Mon, Apr 21, 2014 at 11:15 PM, David Wardell <dcwar...@gmail.com> wrote:
> You are a genius.
>
> I simply placed all the objects (excluding the Isolate) in a sub-block and
> then called dispose after this sub-block (thus forcing the other objects'
> destructors before the call to Dispose()).
>
> It even got rid of all the memory leak issues with valgrind.
>
> Any explanation on what was going on underneath (or better yet a link
> explaining whats going on under the hood)? Thank you.

I don't know of any links that explain how this works but it's quite
simple, really. Isolates, Contexts, HandleScopes, etc. are things you
as a user can nest. You can't exit or destroy V8 before everything
has been unwound again.

As an analogy: if you think of V8 as a pallet, then it stands to
reason that you can't remove the pallet until everything that's been
stacked on top of it has been removed.
Reply all
Reply to author
Forward
0 new messages