【问题标题】:Blackfin uClinux socket creation failureBlackfin uClinux 套接字创建失败
【发布时间】:2013-12-02 20:54:39
【问题描述】:

我的客户有一个旧版本的 uClinux,内核 2.6.22,在 Blackfin STAMP 板上运行。主应用分为 14 个进程,另外还有一个网络服务器在板上运行。

我们看到的错误是,网络服务器一直在正常运行,而 VOIP 应用程序似乎用完了文件句柄并且无法创建新的套接字。我已经尝试了我所知道的所有调试技术。我有一个 JTAG 调试器,但内存对于调试符号来说太小了。我不能用 Valgrind 或类似的东西编译。有什么猜测吗?

谢谢,

迈克

【问题讨论】:

  • 哦,当我在非工作系统上执行“df”时,有时会看到 /dev/mtdblock0 已满。那是作为根文件系统安装的,这很奇怪,因为我认为 MTD 仅适用于闪存。还有一个 mtdblock4,它挂载在 /flash 上,永远不会填满。

标签: sockets resource-leak uclinux


【解决方案1】:

您可能遇到了文件描述符泄漏。无论如何,Valgrind 并不是追踪它的最佳工具。

首先执行“ls -lah /proc/pid/fd”。这将向您显示该进程打开(但尚未关闭)的文件描述符列表。 如果你真的有文件描述符泄漏,你应该在那里看到很多条目。您泄漏的文件描述符类型(文件、套接字、...)也应该立即显而易见。

一旦您知道您将更好地了解在代码中的何处查找泄漏。

您的文件系统已满这一事实可能是另一个提示。如果您的应用程序正在创建一个文件并删除它,但没有关闭文件描述符,那么您可能会在树中找到一堆文件,但它们仍然会占用周围的空间。在这种情况下,您将在/proc/pid/fd 中看到文件名(符号链接的目标)。

【讨论】:

  • 谢谢,我已经查看了 /proc。旧版本的 Linux 在这方面有点奇怪,但我愿意(需要)弄清楚。我猜它被称为 LinuxThreads,一个 pthread 产生了一个完整的进程。据我了解,这已被实际的 POSIX 线程所取代。
  • 它必须是每个进程的,而不是全局的,文件描述符泄漏,因为网络服务器仍然可以工作。还是我弄错了?
  • 是的,Linux 限制了每个进程可以分配的文件描述符的数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
相关资源
最近更新 更多