V8 Android,创建上下文导致ASSERT ... CHECK(object-> IsJSFunction())失败

时间:2011-03-23 21:39:05

标签: android v8

我已成功将Android的V8 javascript引擎编译为静态库(libv8arm.a),我可以将其静态链接到我的Android原生C ++应用程序(使用ndk-r5b)。

在Android上,当创建V8上下文时,我得到这个运行时断言......

//初始化V8上下文。

Local globals = ObjectTemplate :: New();

context = Context :: New(NULL,globals);

v8 / src / objects-inl.h,第1581行中的致命错误

CHECK(object-> IsJSFunction())失败

当我将V8嵌入我的应用程序的MacOSX版本时,一切运行正常,我可以毫无问题地执行javascript。我花了很多时间来分析代码,并且还在寻找用于构建V8 for Android的gcc命令行参数。我被卡住了,并且非常接近将V8代码破解成碎片来解决它。

有谁知道V8运行时初始化需要通过Context :: New()断言的内容?

感谢。


更新:
我试图通过修改CAST_ACCESSOR宏来捕获此问题......

extern int __cast_accessor_count /* = 0 */;

// in the cpp file where Context::New() is called 
//namespace v8 { namespace internal {
//int __cast_accessor_count = 0;
//}; };

#define CAST_ACCESSOR(type)                     \
  type* type::cast(Object* object) {            \
    __cast_accessor_count++;                    \
    if( !object->Is##type() ) { OS::Print( "CAST_ACCESSOR %d %s\n",     __cast_accessor_count, #type );  object->ShortPrint(); } \
    ASSERT(object->Is##type());                 \
    return reinterpret_cast<type*>(object);     \
  }  

...并在调用Context :: New()...

之前和之后打印值
printf( "__cast_accessor_count=%d\n", v8::internal::__cast_accessor_count );

// Create a new context.
Persistent<Context> context = Context::New();

printf( "__cast_accessor_count=%d\n", v8::internal::__cast_accessor_count );

在我的MacOSX测试应用中,输出为

__cast_accessor_count=0  
(gdb) continue  
__cast_accessor_count=272875  

在Android上,输出断言之前的输出是

__cast_accessor_count=0  
CAST_ACCESSOR 101980 JSFunction  
0x486c4135 <undefined>  

通过V8代码搜索找到object-&gt; ShortPrint()输出“undefined”的位置,我发现了这个......

case ODDBALL_TYPE: {
  if (IsUndefined())
    accumulator->Add("<undefined>");

我想知道codegen是否发出了ODDBALL_TYPE,它对于IA32程序集和ARM程序集是不同的。这可能解释了每个平台上的不同初始化。


UPDATE2:
终于得到了一个有效的callstack ......

0x001e3b4e:                PAUL_DEBUG_BREAK + 0x002e
0x0023d916:_ZN2v88internal10JSFunction4castEPNS0_6ObjectE + 0x0056
0x00251594:_ZN2v88internal7Genesis17InstallJSBuiltinsENS0_6HandleINS0_16JSBuiltinsObjectEEE + 0x0048
0x00250e6c:_ZN2v88internal7Genesis14InstallNativesEv + 0x05e8
0x0025241c:_ZN2v88internal7GenesisC1ENS0_6HandleINS0_6ObjectEEENS_6HandleINS_14ObjectTemplateEEEPNS_22ExtensionConfigurationE + 0x01c4
0x0024ed5a:_ZN2v88internal12Bootstrapper17CreateEnvironmentENS0_6HandleINS0_6ObjectEEENS_6HandleINS_14ObjectTemplateEEEPNS_22ExtensionConfigurationE + 0x0022
0x00247a46:_ZN2v87Context3NewEPNS_22ExtensionConfigurationENS_6HandleINS_14ObjectTemplateEEENS3_INS_5ValueEEE + 0x017e
0x001e3c02:    _ZN16JavascriptEngine4InitEv + 0x007a

arm-eabi-c ++ filt

v8::internal::JSFunction::cast(v8::internal::Object*)
v8::internal::Genesis::InstallJSBuiltins(v8::internal::Handle<v8::internal::JSBuiltinsObject>)
v8::internal::Genesis::InstallNatives()
v8::internal::Genesis::Genesis(v8::internal::Handle<v8::internal::Object>,     v8::Handle<v8::ObjectTemplate>, v8::ExtensionConfiguration*)
v8::internal::Bootstrapper::CreateEnvironment(v8::internal::Handle<v8::internal::Object>,     v8::Handle<v8::ObjectTemplate>, v8::ExtensionConfiguration*)
v8::Context::New(v8::ExtensionConfiguration*, v8::Handle<v8::ObjectTemplate>,     v8::Handle<v8::Value>)
JavascriptEngine::Init()  

1 个答案:

答案 0 :(得分:4)

libraries.cc就是答案。

在android上,我使用的是为macosx构建生成的libraries.cc文件。我通过使用js2c.py工具为android生成一个新的libraries.cc文件修复了android上的问题。