2009/10/19 Flier Lu <[email protected]>: > > So, do you mean that I need fire a GC before serialize/deserialize > heap? and how can I ensure the GC roots keep same numbers? Are there > any tools could dump the whole heap and make a difference for > troubleshoting?
You should try running the debug version of the VM and using the --debug-serialization flag. This will insert tags in the serialization stream which will be checked when deserializing. Looking at where this happens in gdb may tell you where the serializer and the deserializer are getting out of sync. Good luck! > > Thanks any way, I think I could try to adjust context later. > > On 10月18日, 下午5时25分, Erik Corry <[email protected]> wrote: >> The serialization/deserialization code is very sensitive to what the >> VM has done since it started up. Installing extensions and probably >> many other API calls like context creation etc. will cause garbage >> collection roots to be created. These are traversed when serializing >> and deserializing and if the number of them doesn't match up then you >> will probably get a crash. >> >> I realize this is not very detailed help. It may help to compile in >> debug mode to get the asserts etc. which could give you more of a clue >> as to what is going on. >> >> 2009/10/18 Flier Lu <[email protected]>: >> >> >> >> >> >> > I'm trying to add serialize/deserialize supports to pyv8, a two-way >> > python and v8 wrapper, base on the v8 internal APIs. >> >> > Till now, I could dump the snapshot with Serializer.Serialize, but >> > fail to use it to initialize v8 again. The >> > Deserializer::GetContextStack function failed, because the expected >> > format is wrong. I'm confused because the snapshot was generated with >> > same v8 version, even the size seems too smaller (262K) than cctest >> > generated serdes (432K). >> >> > Could you give me some hints, what I missed when dumping the snapshot? >> > I just refer the test-serialze.cc code and translate it to python >> > wrapper. >> >> > Thanks >> >> > # test code with pyv8 >> > #!/usr/bin/env python >> > import sys >> >> > from PyV8 import * >> >> > if len(sys.argv) == 1: >> > extSrc = """function hello(name) { return "hello " + name + " from >> > javascript"; }""" >> > extJs = JSExtension("hello/javascript", extSrc) >> >> > JSEngine.serializeEnabled = True >> >> > with JSContext(extensions=['hello/javascript']) as ctxt: >> > data = JSEngine.serialize() >> >> > open('snapshot.dat', 'wb').write(data) >> >> > print "write %d bytes to snapshot.dat" % len(data) >> > else: >> > data = open(sys.argv[1], 'rb').read() >> >> > print "read %d bytes from %s" % (len(data), sys.argv[1]) >> >> > raw_input() >> >> > JSEngine.deserialize(data) >> >> > with JSContext() as ctxt: >> > print ctxt.eval("hello('flier')") >> >> > # implementation code in pyv8 >> > #http://code.google.com/p/pyv8/source/browse/trunk/src/Engine.cpp >> > py::object CEngine::Serialize(void) >> > { >> > v8::internal::byte* data = NULL; >> > int size = 0; >> >> > Py_BEGIN_ALLOW_THREADS >> >> > v8::internal::StatsTable::SetCounterFunction >> > (&CEngine::CounterLookup); >> >> > v8::internal::Serializer serializer; >> >> > serializer.Serialize(); >> >> > serializer.Finalize(&data, &size); >> >> > Py_END_ALLOW_THREADS >> >> > py::object obj(py::handle<>(::PyBuffer_New(size))); >> >> > void *buf = NULL; >> > Py_ssize_t len = 0; >> >> > if (0 == ::PyObject_AsWriteBuffer(obj.ptr(), &buf, &len) && buf && >> > len > 0) >> > { >> > memcpy(buf, data, len); >> > } >> > else >> > { >> > obj = py::object(); >> > } >> >> > return obj; >> > } >> > void CEngine::Deserialize(py::object snapshot) >> > { >> > const void *buf = NULL; >> > Py_ssize_t len = 0; >> >> > if (PyBuffer_Check(snapshot.ptr())) >> > { >> > if (0 != ::PyObject_AsReadBuffer(snapshot.ptr(), &buf, &len)) >> > { >> > buf = NULL; >> > } >> > } >> > else if(PyString_CheckExact(snapshot.ptr()) || PyUnicode_CheckExact >> > (snapshot.ptr())) >> > { >> > if (0 != ::PyString_AsStringAndSize(snapshot.ptr(), (char **)&buf, >> > &len)) >> > { >> > buf = NULL; >> > } >> > } >> >> > if (buf && len > 0) >> > { >> > Py_BEGIN_ALLOW_THREADS >> >> > v8::internal::Deserializer deserializer((const v8::internal::byte >> > *) buf, len); >> >> > deserializer.GetFlags(); >> >> > v8::internal::V8::Initialize(&deserializer); >> >> > Py_END_ALLOW_THREADS >> > } >> > } >> >> > # error message when execute the test code >> > # >> > # Fatal error in d:\javascript\google-v8\src\serialize.h, line 221 >> > # CHECK(c == expected) failed >> > # >> >> > # call stack for error >> >> _PyV8.pyd!v8::internal::OS::DebugBreak() Line 882 C++ >> > _PyV8.pyd!v8::internal::OS::Abort() Line 877 C++ >> > _PyV8.pyd!V8_Fatal(const char * file=0x1052ddfc, int line=221, const >> > char * format=0x10527e68, ...) Line 57 C++ >> > _PyV8.pyd!CheckHelper(const char * file=0x1052ddfc, int line=221, >> > const char * source=0x1052e0bc, bool condition=false) Line 62 + 0x16 >> > bytes C++ >> > _PyV8.pyd!v8::internal::SnapshotReader::ExpectC(char expected='C') >> > Line 221 + 0x22 bytes C++ >> > _PyV8.pyd!v8::internal::Deserializer::GetContextStack() Line 1595 >> > C+ >> > + >> > _PyV8.pyd!v8::internal::Deserializer::Deserialize() Line 1431 C++ >> > _PyV8.pyd!v8::internal::V8::Initialize(v8::internal::Deserializer * >> > des=0x0021f300) Line 106 C++ >> > _PyV8.pyd!CEngine::Deserialize(boost::python::api::object snapshot= >> > {...}) Line 182 + 0xc bytes C++ >> > _PyV8.pyd!boost::python::detail::invoke<int,void (__cdecl*) >> > (boost::python::api::object),boost::python::arg_from_python<boost::python:: >> > api::object> >> >>(boost::python::detail::invoke_tag_<1,0> __formal={...}, >> > boost::python::detail::invoke_tag_<1,0> __formal={...}, void >> > (boost::python::api::object)* & f=0x101a8cf4, >> > boost::python::arg_from_python<boost::python::api::object> & ac0= >> > {...}) Line 81 + 0x1f bytes C++ >> > _PyV8.pyd!boost::python::detail::caller_arity<1>::impl<void >> > (__cdecl*) >> > (boost::python::api::object),boost::python::default_call_policies,boost::mp >> > l::vector2<void,boost::python::api::object> >> >>::operator()(_object * args_=0x01312610, _object * >> > __formal=0x00000000) Line 223 + 0x37 bytes C++ >> > _PyV8.pyd! >> > boost::python::objects::caller_py_function_impl<boost::python::detail::call >> > er<void >> > (__cdecl*) >> > (boost::python::api::object),boost::python::default_call_policies,boost::mp >> > l::vector2<void,boost::python::api::object> >> >> >::operator()(_object * args=0x01312610, _object * kw=0x00000000) >> > Line 39 C++ >> > _PyV8.pyd!boost::python::objects::py_function::operator()(_object * >> > args=0x01312610, _object * kw=0x00000000) Line 144 C++ >> > _PyV8.pyd!boost::python::objects::function::call(_object * >> > args=0x01312610, _object * keywords=0x00000000) Line 226 + 0x24 bytes >> > C++ >> > _PyV8.pyd!boost::python::objects::`anonymous >> > namespace'::bind_return::operator()() Line 581 + 0x19 bytes C++ >> > _PyV8.pyd! >> > boost::detail::function::void_function_ref_invoker0<boost::python::objects: >> > :`anonymous >> > namespace'::bind_return,void>::invoke >> > (boost::detail::function::function_buffer & function_obj_ptr={...}) >> > Line 189 C++ >> > _PyV8.pyd!boost::function0<void>::operator()() Line 1013 + 0x14 >> > bytes C++ >> > _PyV8.pyd!boost::python::detail::exception_handler::operator()(const >> > boost::function0<void> & f={...}) Line 75 C++ >> > _PyV8.pyd! >> > boost::python::detail::translate_exception<CJavascriptException,void >> > (__cdecl*)(CJavascriptException const &)>::operator()(const >> > boost::python::detail::exception_handler & handler={...}, const >> > boost::function0<void> & f={...}, void (const CJavascriptException &)* >> > const translate=0x101a98a2) Line 46 + 0xc bytes C++ >> > _PyV8.pyd! >> > boost::_bi::list3<boost::arg<1>,boost::arg<2>,boost::_bi::value<void >> > (__cdecl*)(CJavascriptException const &)> >::operator() >> > <bool,boost::python::detail::translate_exception<CJavascriptException,void >> > (__cdecl*)(CJavascriptException const &) >> >>,boost::_bi::list2<boost::python::detail::exception_handler const >> > &,boost::function0<void> const &> >(boost::_bi::type<bool> __formal= >> > {...}, >> > boost::python::detail::translate_exception<CJavascriptException,void >> > (__cdecl*)(CJavascriptException const &)> & f={...}, >> > boost::_bi::list2<boost::python::detail::exception_handler const >> > &,boost::function0<void> const &> & a={...}, boost::_bi::type<bool> >> > __formal={...}) Line 376 C++ >> > _PyV8.pyd! >> > boost::_bi::bind_t<bool,boost::python::detail::translate_exception<CJavascr >> > iptException,void >> > (__cdecl*)(CJavascriptException const &) >> >>,boost::_bi::list3<boost::arg<1>,boost::arg<2>,boost::_bi::value<void >> > (__cdecl*)(CJavascriptException const &)> > >::operator() >> > <boost::python::detail::exception_handler,boost::function0<void> > >> > (const boost::python::detail::exception_handler & a1={...}, const >> > boost::function0<void> & a2={...}) Line 103 C++ >> > _PyV8.pyd! >> > boost::detail::function::function_obj_invoker2<boost::_bi::bind_t<bool,boos >> > t::python::detail::translate_exception<CJavascriptException,void >> > (__cdecl*)(CJavascriptException const &) >> >>,boost::_bi::list3<boost::arg<1>,boost::arg<2>,boost::_bi::value<void >> > (__cdecl*)(CJavascriptException const &)> > >> >>,bool,boost::python::detail::exception_handler const >> > &,boost::function0<void> const &>::invoke >> > (boost::detail::function::function_buffer & function_obj_ptr={...}, >> > const boost::python::detail::exception_handler & a0={...}, const >> > boost::function0<void> & a1={...}) Line 133 C++ >> > _PyV8.pyd! >> > boost::function2<bool,boost::python::detail::exception_handler const >> > &,boost::function0<void> const &>::operator()(const >> > boost::python::detail::exception_handler & a0={...}, const >> > boost::function0<void> & a1={...}) Line 1013 + 0x1c bytes C++ >> > _PyV8.pyd!boost::python::detail::exception_handler::handle(const >> > boost::function0<void> & f={...}) Line 42 C++ >> > _PyV8.pyd!boost::python::handle_exception_impl >> > (boost::function0<void> f={...}) Line 24 + 0xf bytes C++ >> > _PyV8.pyd! >> > boost::python::handle_exception<boost::python::objects::`anonymous >> > namespace'::bind_return>(boost::python::objects::`anonymous- >> > namespace'::bind_return f={...}) Line 29 + 0x2c bytes C++ >> > _PyV8.pyd!function_call(_object * func=0x01bacb40, _object * >> > args=0x01312610,... >> >> 阅读更多 >> > > > -- Erik Corry, Software Engineer Google Denmark ApS. CVR nr. 28 86 69 84 c/o Philip & Partners, 7 Vognmagergade, P.O. Box 2227, DK-1018 Copenhagen K, Denmark. --~--~---------~--~----~------------~-------~--~----~ v8-users mailing list [email protected] http://groups.google.com/group/v8-users -~----------~----~----~----~------~----~------~--~---
