- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是一名安卓程序员。
今天我运行一个 Android 应用程序时遇到了此类错误。
FORTIFY_SOURCE: FD_SET: file descriptor >= FD_SETSIZE. Calling abort().
所以如果有人知道这个问题的答案请回复我。
最佳答案
您的进程打开了太多文件描述符或套接字,当达到操作系统限制时,您的应用程序将被终止。
您的应用不太可能合法地用完所有资源,这很可能是泄漏。您很可能错过了对套接字或文件资源的 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
关于android - FORTIFY_SOURCE : FD_SET: file descriptor >= FD_SETSIZE. 调用中止(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30521826/
我遇到了 FD_SET 使我的程序崩溃的问题。我正在运行来自 boost Boost ASIO sample HTTP Server 的示例代码.在请求处理程序中,我放置了一个第三方 api,最终会进
**编辑:我找到了解决方案。** 对于那些敢于阅读以下内容的人,我有一个奇怪的问题: 我正在做家庭作业,需要使用 UNIX 管道在进程之间发送消息。 我对这段代码的意图是对提供的文件描述符进行 sel
我想知道是否有一种简单的方法可以遍历 fd_set?我想这样做的原因是不必遍历所有连接的套接字,因为 select() 将这些 fd_set 更改为仅包含我感兴趣的那些。我也知道,使用不打算直接访问的
我有以下 C 代码,用于设置 select() 以监听 TCP 套接字和消息队列上的传入数据: fd_set readSet; u32 maxFD = 0; mqd_t parentQueue; in
嗨,现在我想知道客户端或服务器是否断开连接,然后发送错误,但我似乎无法让它工作,我不知道该怎么做,所以我真的需要帮助 plz 这是我的代码 #ifdef _WIN32 || _WIN64
我的代码有问题,我无法找出问题所在,因为我是 select() 的新手; 谁能告诉我问题出在哪里? run_fct.c: In function ‘run’: run_fct.c:22: error:
我在编写我的第一个带有单选调用的异步服务器时遇到了这个问题: if( (retv = select((hsock 0) { printf("select() ended...\n");
我在 Linux 中有一个工作代码,正在移植到 Windows。它使用套接字库。 当我声明 fd_set xyz 时,它通过一个错误提示 error C2065: 'xyz' : undeclared
我在两个 UDP 套接字上有一个 select。有时 select 返回 2,因此两个套接字都已准备好接收,但我想首先接收可读取的最旧消息。有什么方法可以存档吗? 我需要首先获取最先到达的消息: 消息
如果当我在 select 系统调用中使用的 rdset 中放置一个连接描述符时,客户端关闭了该描述符,因此在调用 select 时它已经关闭,它是否仍会被选中并读取/在上面写上 return 0? 还
我目前正在处理的应用程序是一个服务器,它将使用 select() 管理与客户端的连接,每次服务器收到消息时,它都会打开一个新线程以读取套接字。在此期间,套接字的文件描述符从集合中删除,并将在读取结束时
我知道这不是出现此错误的第一个线程,但我真的无法理解问题所在...我的代码如下: /* File descriptor sets */ struct descs { fd_set read;
最近被FD_SET缓冲区溢出咬了两次。第一次是我们有太多套接字 (1024+) 添加到 FD_SET 中。这是一个测试用例,我们已将其禁用,并添加 assert 来检测此用例。 今天,当我们运行一个测
根据这篇文章poll vs select vs event-based : select() only uses (at maximum) three bits of data per file de
我有一个关于向 FDSET 添加新套接字文件描述符的问题。假设我们已经连接到套接字 s1: fd_set readfds; //s1 = socket(...); //connect(s1, ...)
我正在编写一个使用 select() 的程序,给定一个要读取的 fd_set。 在程序中,我保存了两个 fd_sets: 1. fd_set 名为 DB,包含我可以处理的所有 fd。 2. fd_se
我正在开发一个多客户端 Unix Domain Socket,以通过多个进程传输数据。我找到了一些实现每个客户端和其他东西之间聊天的代码,但我希望一旦客户端向服务器发送某些内容,服务器就会回复并断开客
我不是网络编程专家。我基本上有两种客户,他们有不同的超时时间。我应该使用带有连接套接字的 UDP 来进行客户端-服务器通信。 问题是双重的: a) 无论哪个客户端(或者套接字)在 t1 秒内没有响应,
我正在使用 select() 来衡量服务器没有收到任何新消息的时间。代码非常简单,看起来像这样: int res = -1; do { FD_ZERO(&readfds); FD_SE
我试图了解套接字编程和处理多个连接时的不同做法。特别是当服务器需要为多个客户端提供服务时。 我看过一些代码示例;其中一些使用 fd_set 而另一些使用 fork() 系统调用。 大致: FD_SET
我是一名优秀的程序员,十分优秀!