Javascript 无限递归函数在 Android 10 上使 Chromium 50 ARM64 库崩溃

Javascript infinite recursive function crashes Chromium 50 ARM64 lib on Android 10

我的 Android 应用程序使用基于 Chromium 50(V8 JavaScript 引擎 5.0)的类似 Web 视图的控件。由于各种原因,无法使用系统 WebView 或更新的 Chromium 版本。

我仅在 Android 10 和 arm64 版本的二进制文件上收到很多 Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR) 崩溃。具有旧 Android 版本的相同二进制文件以及具有 Android 10 的二进制文件的 32 位版本没有问题。

这是一个包含崩溃的无限递归函数的示例代码: webView.evaluateJavascript("(function a(i) { a(i++); })()", null);

来自 Android 工作室调试器的堆栈跟踪:

art_sigsegv_fault 0x000000753da02e9c
art::FaultManager::HandleFault(int, siginfo*, void*) 0x000000753da033a4
___lldb_unnamed_symbol24$$app_process64 0x0000005ca3207da8
<unknown> 0x00000075c3f888c0
<unknown> 0x00000074784191e8
<unknown> 0x00000074784191e8
<unknown> 0x00000074784191e8
<unknown> 0x00000074784191e8
<unknown> 0x00000074784191e8
............... the same line 15560 times
<unknown> 0x000000747830be94
<unknown> 0x000000747841937c
<unknown> 0x0000007478339a28
<unknown> 0x000000747831fe30

欢迎提出任何避免这些崩溃的想法。

这里是 V8 开发人员。您提到的 link 讨论了 system 库。我不知道为什么 V8 会尝试读取系统库。你确定这是怎么回事?您可以 运行 调试构建并获取堆栈跟踪吗?如果没有进一步的数据,我会怀疑还有其他事情正在发生并导致这些崩溃。

FWIW:

--untrusted-code-mitigations 导致(优化)编译器发出代码序列,(部分)缓解最近发现的 "spectre" CPU 安全漏洞。这与 Android 10 兼容性完全无关。

--jitless 在足够新的 V8 版本中关闭所有即时代码生成(当然,性能成本很高)。这也与 Android 系统二进制文件的只执行内存无关。

更新 更新问题后,并在评论中讨论:

根据堆栈跟踪,进程似乎在 运行 出堆栈 space 时崩溃。 V8 应该检测到这种情况并在这种情况发生之前抛出 RangeError;通过了解进程可用的堆栈 space 的估计来实现这一目标的机制。显然,(至少)您的应用 运行ning 在 Android 10 上的特定组合,剩余堆栈 space 少于 V8 v5.0 预期。解决方法是使用标志 --stack-size=800 运行,或者编辑 src/globals.h.

中的 V8_DEFAULT_STACK_SIZE_KB 常量

给其他读者的提示:将 --stack-size 设置为一个巨大的值不会神奇地给你更深的递归限制;相反,当超过操作系统定义的堆栈限制时,它会让您的进程崩溃,而不是抛出 RangeError。将 --stack-size 设置得太低将意味着 JavaScript 代码在抛出 RangeError.通常建议不理会此标志,除非您 运行 遇到像这里这样的特定问题,小的调整会有所帮助。