我有一个使用嵌入式 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(),所以我猜这可能是一个处于无效状态的垃圾收集对象?
提前感谢您的任何意见。