我的客户有一个旧版本的 uClinux,内核 2.6.22,在 Blackfin STAMP 板上运行。主应用程序分为 14 个进程,另外还有一个网络服务器在板上运行。
我们看到的错误是,网络服务器一直在愉快地运行,而 VOIP 应用程序似乎用完了文件句柄并且无法创建新的套接字。我已经尝试了我所知道的所有调试技术。我有一个 JTAG 调试器,但内存对于调试符号来说太小了。我不能用 Valgrind 或类似的东西编译。有什么猜测吗?
谢谢,
麦克风
我的客户有一个旧版本的 uClinux,内核 2.6.22,在 Blackfin STAMP 板上运行。主应用程序分为 14 个进程,另外还有一个网络服务器在板上运行。
我们看到的错误是,网络服务器一直在愉快地运行,而 VOIP 应用程序似乎用完了文件句柄并且无法创建新的套接字。我已经尝试了我所知道的所有调试技术。我有一个 JTAG 调试器,但内存对于调试符号来说太小了。我不能用 Valgrind 或类似的东西编译。有什么猜测吗?
谢谢,
麦克风
很可能您遇到了文件描述符泄漏。无论如何,Valgrind 并不是追踪它的最佳工具。
首先执行“ls -lah /proc/ pid /fd”。这将向您显示该进程打开(但尚未关闭)的文件描述符列表。如果你真的有文件描述符泄漏,你应该在那里看到很多条目。您泄漏的文件描述符类型(文件,套接字,...)也应该立即显而易见。
一旦您知道您将更好地了解在代码中查找泄漏的位置。
您的文件系统已满这一事实可能是另一个提示。如果您的应用程序正在创建一个文件并删除它,但没有关闭文件描述符,那么您可能会在树中找到一堆文件,但它们仍然会占用周围的空间。在这种情况下,您将在/proc/ pid /fd 中(符号链接的目标)中看到文件名。