Утечки памяти в разделяемую библиотеку v8 (dll) версии 4.1.0.3 - PullRequest
0 голосов
/ 22 ноября 2018

Я использую Google V8 в качестве разделяемой библиотеки в простом приложении под Windows.Прямо сейчас приложение просто компилирует JavaScript без выполнения.Vld показывает утечки памяти в v8.dll.У этих утечек есть стек вызовов, подобный следующему:

c:\program files (x86)\microsoft visual studio 14.0\vc\include\xmemory0 (977): v8.dll!std::_Wrap_alloc<std::allocator<std::_Container_proxy> >::allocate()
c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector (580): v8.dll!std::_Vector_alloc<std::_Vec_base_types<unsigned char,std::allocator<unsigned char> > >::_Alloc_proxy() + 0xF bytes
c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector (545): v8.dll!std::_Vector_alloc<std::_Vec_base_types<unsigned char,std::allocator<unsigned char> > >::_Vector_alloc<std::_Vec_base_types<unsigned char,std::allocator<unsigned char> > >() + 0xA bytes
c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector (706): v8.dll!std::vector<unsigned char,std::allocator<unsigned char> >::vector<unsigned char,std::allocator<unsigned char> >() + 0xA bytes
c:\work\v8\4.1.0.3\v8\src\type-feedback-vector.h (21): v8.dll!v8::internal::FeedbackVectorSpec::FeedbackVectorSpec() + 0x31 bytes
c:\work\v8\4.1.0.3\v8\src\ast.h (175): v8.dll!v8::internal::AstProperties::AstProperties() + 0x33 bytes
c:\work\v8\4.1.0.3\v8\src\ast.h (2607): v8.dll!v8::internal::FunctionLiteral::FunctionLiteral() + 0x22 bytes
c:\work\v8\4.1.0.3\v8\src\ast.h (3515): v8.dll!v8::internal::AstNodeFactory::NewFunctionLiteral() + 0xDC bytes
c:\work\v8\4.1.0.3\v8\src\parser.cc (3814): v8.dll!v8::internal::Parser::ParseFunctionLiteral() + 0xBD bytes
c:\work\v8\4.1.0.3\v8\src\parser.cc (1060): v8.dll!v8::internal::Parser::ParseLazy() + 0x71 bytes
c:\work\v8\4.1.0.3\v8\src\parser.cc (1000): v8.dll!v8::internal::Parser::ParseLazy() + 0x15 bytes
c:\work\v8\4.1.0.3\v8\src\parser.cc (5125): v8.dll!v8::internal::Parser::Parse() + 0xA bytes
c:\work\v8\4.1.0.3\v8\src\parser.h (673): v8.dll!v8::internal::Parser::Parse() + 0xA bytes
c:\work\v8\4.1.0.3\v8\src\compiler.cc (687): v8.dll!v8::internal::GetUnoptimizedCodeCommon() + 0xF bytes
c:\work\v8\4.1.0.3\v8\src\compiler.cc (966): v8.dll!v8::internal::Compiler::GetLazyCode() + 0x15 bytes
c:\work\v8\4.1.0.3\v8\src\runtime\runtime-compiler.cc (36): v8.dll!v8::internal::__RT_impl_Runtime_CompileLazy() + 0xF bytes
c:\work\v8\4.1.0.3\v8\src\runtime\runtime-compiler.cc (20): v8.dll!v8::internal::Runtime_CompileLazy() + 0x72 bytes

...

c:\program files (x86)\microsoft visual studio 14.0\vc\include\xmemory0 (977): v8.dll!std::_Wrap_alloc<std::allocator<std::_Container_proxy> >::allocate()
c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector (580): v8.dll!std::_Vector_alloc<std::_Vec_base_types<unsigned char,std::allocator<unsigned char> > >::_Alloc_proxy() + 0xF bytes
c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector (545): v8.dll!std::_Vector_alloc<std::_Vec_base_types<unsigned char,std::allocator<unsigned char> > >::_Vector_alloc<std::_Vec_base_types<unsigned char,std::allocator<unsigned char> > >() + 0xA bytes
c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector (706): v8.dll!std::vector<unsigned char,std::allocator<unsigned char> >::vector<unsigned char,std::allocator<unsigned char> >() + 0xA bytes
c:\work\v8\4.1.0.3\v8\src\type-feedback-vector.h (21): v8.dll!v8::internal::FeedbackVectorSpec::FeedbackVectorSpec() + 0x31 bytes
c:\work\v8\4.1.0.3\v8\src\ast.h (175): v8.dll!v8::internal::AstProperties::AstProperties() + 0x33 bytes
c:\work\v8\4.1.0.3\v8\src\ast.h (2607): v8.dll!v8::internal::FunctionLiteral::FunctionLiteral() + 0x22 bytes
c:\work\v8\4.1.0.3\v8\src\ast.h (3515): v8.dll!v8::internal::AstNodeFactory::NewFunctionLiteral() + 0xDC bytes
c:\work\v8\4.1.0.3\v8\src\parser.cc (957): v8.dll!v8::internal::Parser::DoParseProgram() + 0x10B bytes
c:\work\v8\4.1.0.3\v8\src\parser.cc (861): v8.dll!v8::internal::Parser::ParseProgram() + 0x27 bytes
c:\work\v8\4.1.0.3\v8\src\parser.cc (5131): v8.dll!v8::internal::Parser::Parse() + 0xA bytes
c:\work\v8\4.1.0.3\v8\src\parser.h (673): v8.dll!v8::internal::Parser::Parse() + 0xA bytes
c:\work\v8\4.1.0.3\v8\src\compiler.cc (1148): v8.dll!v8::internal::CompileToplevel() + 0x12 bytes
c:\work\v8\4.1.0.3\v8\src\compiler.cc (1338): v8.dll!v8::internal::Compiler::CompileScript() + 0x15 bytes
c:\work\v8\4.1.0.3\v8\src\bootstrapper.cc (1448): v8.dll!v8::internal::Genesis::CompileScriptCached() + 0x9E bytes
c:\work\v8\4.1.0.3\v8\src\bootstrapper.cc (1418): v8.dll!v8::internal::Genesis::CompileNative() + 0x64 bytes
c:\work\v8\4.1.0.3\v8\src\bootstrapper.cc (1404): v8.dll!v8::internal::Genesis::CompileExperimentalBuiltin()
c:\work\v8\4.1.0.3\v8\src\bootstrapper.cc (2198): v8.dll!v8::internal::Genesis::InstallExperimentalNatives() + 0x19B bytes
c:\work\v8\4.1.0.3\v8\src\bootstrapper.cc (2766): v8.dll!v8::internal::Genesis::Genesis() + 0xD bytes
c:\work\v8\4.1.0.3\v8\src\bootstrapper.cc (351): v8.dll!v8::internal::Bootstrapper::CreateEnvironment() + 0x32 bytes
c:\work\v8\4.1.0.3\v8\src\api.cc (5229): v8.dll!v8::CreateEnvironment() + 0x34 bytes
c:\work\v8\4.1.0.3\v8\src\api.cc (5260): v8.dll!v8::Context::New()

Может быть, кто-то сталкивался с такой же проблемой раньше и может помочь мне найти корень этих утечек памяти в dll v8, чтобы исправить это.

Версия3.31.26 V8 не имеет таких утечек памяти, как эти.

Мое приложение очень простое, в первую очередь init v8:

v8::V8::InitializeICU();
auto platform = platform_ptr(v8::platform::CreateDefaultPlatform());
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();

create изолировать:

isolate_ = v8::Isolate::New();
v8::HandleScope handle_scope(isolate_);
global_template_ = std::make_unique<js_compilation::global_template_wrapper>(isolate_);

компиляция js-кода:

void js_compilation::compile(const std::string &js_script)
{
    v8::Locker locker(isolate_);
    v8::Isolate::Scope scope(isolate_);

    //Create a stack allocated handle scope
    v8::HandleScope handle_scope(isolate_);
    v8::TryCatch try_catch(isolate_);

    //Create the global template
    v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate_);

    //Create a context
    v8::Local<v8::Context> context = v8::Context::New(isolate_, NULL, global_template);

    //Set the context scope
    v8::Context::Scope context_scope(context);
    v8::Local<v8::Object> global = context->Global();
    v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate_, js_script.c_str());

    //Compile
    auto script = v8::Script::Compile(source);
    if (script.IsEmpty())
    {
        throw std::runtime_error(get_error_string("Compile error: ", isolate_, try_catch));
    }
    script->Run();

    compiled_script_.Reset(isolate_, script->GetUnboundScript());
}

После компиляции:

compiled_script_.Reset();
isolate_->Dispose();

v8::V8::Dispose();
v8::V8::ShutdownPlatform();

Сценарий компиляции:

const std::string jsScript = "function test_function() {\n" \
    "   var match = 0;\n" \
    "   if (arguments[0] == arguments[1]) {\n" \
    "       match = 1;\n" \
    "   }\n" \
    "   return match;\n" \
    "}\n\n"\

    "function JSrepeat(name, repeat) {\n" \
    "   var printthis = \"\";\n" \
    "   for (var i = 0; i < repeat; i++) {\n" \
    "       printthis += name;\n" \
    "   }\n" \
    "   return printthis;\n" \
    "}\n\n" \

    "function ReturnThis(anything) {\n"\
    "   return anything;\n" \
    "}\n\n"\

    "function $13625432() {\n"\
    "   return \"Jimmy\";\n"\
    "}\n";

1 Ответ

0 голосов
/ 24 ноября 2018

V8 разработчик здесь.Версия 4.1.0.3 является древней и никогда не считалась особенно стабильной (.3 находится сразу после точки ветвления, а не конца стабильной ветки, так что это почти как любой случайный ежедневный снимок).Если вы можете воспроизвести эти проблемы с версией 7.0.276.40 (или более поздней), мне было бы интересно взглянуть поближе, но версии 4.x просто не стоят никого в данный момент, извините.

...