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?
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,... > > 阅读更多 >> --~--~---------~--~----~------------~-------~--~----~ v8-users mailing list [email protected] http://groups.google.com/group/v8-users -~----------~----~----~----~------~----~------~--~---
