NDK 创建的后台线程中的 SIGABRT
SIGABRT in NDK-created background thread
我有一些 Android 从 Xamarin 调用的 NDK 代码。 returns 直接简单的东西是可以的,但是当我创建一个后台线程时,我得到一个 SIGABRT (-6)
并且应用程序死了。
后台线程是用 std::thread(lambda)
创建的。需要一个后台 NDK 线程,因为此代码必须解压缩一个非常大的数据文件,然后 运行 一些 CPU 密集型算法使用解压缩的数据。
现在 SIGABRT 似乎源自 libc,据推测这是应用程序无响应的症状。然而这应该只影响主线程?在开发人员选项中,我确实启用了 "show all ANR" 选项,但它只会在库存 Android 软件周围闪烁几个红框。
为什么 Android 混淆了我的后台线程和前台线程?我如何告诉 Android 不要杀死我的后台线程?
Android v5.1.1 库存 Google/LG Nexus 5.
事实证明 SIGABRT
超载了。它是对应用程序未响应、对 abort()
的调用以及未处理的异常的反应而发生的。 logcat 输出不会告诉您发生了哪些情况。
我通过 dup'ing stderr 发现了这一点 - 解压后的数据与应用程序中的算法不匹配,因此在调用慢算法时立即发生异常。
我有一些 Android 从 Xamarin 调用的 NDK 代码。 returns 直接简单的东西是可以的,但是当我创建一个后台线程时,我得到一个 SIGABRT (-6)
并且应用程序死了。
后台线程是用 std::thread(lambda)
创建的。需要一个后台 NDK 线程,因为此代码必须解压缩一个非常大的数据文件,然后 运行 一些 CPU 密集型算法使用解压缩的数据。
现在 SIGABRT 似乎源自 libc,据推测这是应用程序无响应的症状。然而这应该只影响主线程?在开发人员选项中,我确实启用了 "show all ANR" 选项,但它只会在库存 Android 软件周围闪烁几个红框。
为什么 Android 混淆了我的后台线程和前台线程?我如何告诉 Android 不要杀死我的后台线程?
Android v5.1.1 库存 Google/LG Nexus 5.
事实证明 SIGABRT
超载了。它是对应用程序未响应、对 abort()
的调用以及未处理的异常的反应而发生的。 logcat 输出不会告诉您发生了哪些情况。
我通过 dup'ing stderr 发现了这一点 - 解压后的数据与应用程序中的算法不匹配,因此在调用慢算法时立即发生异常。