2

我有一个使用嵌入式 v8 的现有 Android 应用程序。我们以前只为 ARM 构建,并且能够在不崩溃的情况下运行。现在我们要添加 x86 支持。我构建了针对 x86 的 v8 发布版本(并重建了针对 x86 的 NDK 代码),我的应用程序因 v8 内部的错误而崩溃,因此我重建了 v8 的调试版本并使用 ndk-stack 获取详细的错误信息:

03-29 19:31:59.257: E/v8(7626): #
03-29 19:31:59.257: E/v8(7626): # Fatal error in src/api.h, line 453
03-29 19:31:59.257: E/v8(7626): # 
03-29 19:31:59.257: E/v8(7626): CHECK(entered_contexts_.length() == 0) failed
03-29 19:31:59.257: E/v8(7626): #

在我正在构建的 v8 版本中,这是第 453 行:

ASSERT(entered_contexts_.length() == 0);

这是它作为上下文一部分的函数:

  void Free() {
    ASSERT(blocks_.length() == 0);
    ASSERT(entered_contexts_.length() == 0);
    ASSERT(saved_contexts_.length() == 0);
    blocks_.Free();
    entered_contexts_.Free();
    saved_contexts_.Free();
    if (spare_ != NULL) {
      DeleteArray(spare_);
      spare_ = NULL;
    }
    ASSERT(call_depth_ == 0);
  }

当然有可能我以某种方式错误地为 x86 构建了 v8,但是我验证了 v8 在崩溃之前成功地初始化和解释了脚本(在 x86 上),所以我猜测我们使用 v8 的代码存在问题——也许是ARM 版本比 x86 版本更宽容?

有关如何隔离此问题的任何想法?有什么想法可能导致我进入 Free() 中的断言失败?我认为我没有在任何地方明确调用 Free(),所以我猜这可能是一个处于无效状态的垃圾收集对象?

提前感谢您的任何意见。

4

1 回答 1

0

检查这些链接,

http://software.intel.com/en-us/articles/creating-and-porting-ndk-based-android-apps-for-ia/

示例应用程序移植指南: http: //software.intel.com/en-us/articles/using-the-android-x86-ndk-with-eclipse-and-porting-an-ndk-sample-app

也在那里发布您的查询。

问候, 普里亚

于 2013-10-25T06:38:13.593 回答