FORTIFY_SOURCE:FD_SET:文件描述符> = FD_SETSIZE。呼叫中止()

时间:2015-05-29 05:33:57

标签: android

我是一名Android程序员。

今天我运行了一个Android应用程序,那时我遇到了这种类型的错误。

  

FORTIFY_SOURCE:FD_SET:文件描述符> = FD_SETSIZE。调用abort()。

所以如果有人知道这个问题的答案,请回复我。

2 个答案:

答案 0 :(得分:15)

您的进程打开了太多文件描述符或套接字,当达到操作系统限制时,您的应用程序将被终止。

您的应用程序不太可能合法地耗尽所有资源,很可能是泄漏。您很可能错过了对套接字或文件资源的Close()调用。

我在使用相同代码的各种Android设备上遇到了此问题。最常见的错误签名是:

01-27 15:50:52.431 I/DEBUG   (  172): pid: 12444, tid: 19014, oom: 0, name: DrmRequestHandl  >>> YOUR_PACKAGE_NAME <<<
01-27 15:50:52.431 I/DEBUG   (  172): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
01-27 15:50:52.517 I/DEBUG   (  172): Abort message: 'FORTIFY_SOURCE: FD_SET: file descriptor >= FD_SETSIZE. Calling abort().'

您可以检查设备上的描述符限制:

adb shell ulimit -n

作为解决问题的第一步,您可能需要弄清楚哪种资源正在泄漏。您可以通过以下方式确定应用的流程ID:

 adb shell ps

然后使用进程ID,当您的应用程序仍在运行时,您可以检查打开的描述符(您需要root访问权限或可调试的应用程序/ ROM):

adb shell ls -l  /proc/[YOUR_PROCESS_ID]/fd

对于流程12345,它将类似于:

adb shell ls -l  /proc/12345/fd

这将列出描述符。在较旧的Android版本中,你可以在列表中有1024个项目,在Lollipop上我看到2048作为默认限制。

对于可调试应用,您可以使用run-as(请参阅@Joe的评论):

adb shell run-as com.mycompany.myapplication ls -l /proc/12345/fd

答案 1 :(得分:0)

当我在“ Intel x86 Atom_64”仿真器中测试Vulkan渲染器时,出现了大量名为“ anon_inode:sync_file”的fd泄漏。

不确定是否与此有关,但症状完全相同: https://gitlab.freedesktop.org/mesa/mesa/-/issues/1949

无论如何,它从未在Google API / Play模拟器或真实设备中发生过。

顺便说一下,API级别是29。