【问题标题】:V8 Android, creating the context causes ASSERT ... CHECK(object->IsJSFunction()) failedV8 Android,创建上下文导致 ASSERT ... CHECK(object->IsJSFunction()) 失败
【发布时间】:2011-03-23 21:39:04
【问题描述】:

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

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

// 初始化 V8 上下文。

局部全局变量 = ObjectTemplate::New();

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

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

CHECK(object->IsJSFunction()) 失败

当我将 V8 嵌入到我的应用程序的 MacOSX 版本中时,一切运行良好,我可以毫无问题地执行 javascript。我花了很多时间来区分代码,并查看 gcc 命令行参数以构建 V8 for Android。我被困住了,并且非常接近将 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->ShortPrint() 输出“未定义”的位置,我发现了这个...

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

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


更新2:
终于得到了一个有效的调用栈……

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()  

【问题讨论】:

  • 您使用的是哪个版本?我检查了所有主要分支,但在其中任何一个中都找不到该行的 CHECK。
  • 我正在使用来自 Android 源的 V8 版本。 source.android.com/source/download.html
  • 好的,我现在看到了。不幸的是,JSFunction::cast() 在很多地方都使用过。你能在调试器下运行你的应用程序来获取回溯吗?
  • 不,不幸的是,您不能确定在设备上它在第一次调用 JSFunction::cast() 时失败,因此此堆栈跟踪没有解释任何内容。请在设备 (source.android.com/porting/debugging_gdb.html) 上运行调试器以捕捉它失败的时刻。 (同样下次请不要将堆栈跟踪直接发布到 cmets,而是使用 gist.github.com 之类的东西)。
  • ODDBALL_TYPE 表示对于 ia32 和 ARM 是相同的。奇数球仅在 Heap::CreateInitialObjects 中创建一次。你真的需要弄清楚哪个 JSFunction::cast() 失败了——我们到底在哪里得到了未定义但期望一个 JSFunction。

标签: android v8


【解决方案1】:

libraries.cc 就是答案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多