Solaris中如何检测文件泄漏以及相应的代码

How to detect file leak and the corresponding code in Solaris?

本文关键字:泄漏 代码 文件 何检测 检测 Solaris      更新时间:2023-10-16

如何检测Solaris中的文件泄漏和相应的堆栈?我看到valgrind在Linux上很好地报道了这些信息。如果我们有Solaris上的工具,请告诉我。

在Linux上,您可以使用strace记录所有文件打开关闭调用。然后,您可以分析关于资源泄漏的日志- 打开调用的数量应该与关闭调用的数量匹配。如果这不是真的,那么你就泄密了。在Solaris上有一个类似的工具——DTrace。

在Solaris中,您可以通过简单地使用pfiles命令来查看进程当前打开的文件描述符。如果您想要跟踪打开/关闭的文件,我想到了truss(相当于Solaris中的strace),它带有一个过滤器,用于与文件相关的系统调用(truss -e open,close,但还有其他创建文件描述符的系统调用)。

如果您发现pfiles输出变大,首先确定您泄漏的是普通文件还是socket/pipes之类的东西。如果泄漏的是普通文件,那么可以使用dtrace脚本;以下是我自己实验的基础,我目前手头没有Solaris系统来尝试和改进它。见下文.

#!/usr/bin/dtrace -s
syscall::open:entry { self->t = ustack(); }
syscall::open:return /arg0 >= 0/ { trackedfds[arg0] = self->t; }
syscall::open:return { self->t = 0; }
syscall::close:entry { self->t = arg0; }
syscall::close:return /arg0 >= 0/ { trackedfds[self->t] = 0; }
syscall::close:return { self->t = 0; }
END { printa(trackedfds); }

这将构建一个以文件描述符编号为索引的关联数组,该数组的内容是open()系统调用时的用户端堆栈跟踪。在成功关闭时,给定文件描述符编号的条目将被丢弃,当程序退出(或脚本停止)时,所述关联数组的剩余内容将被打印-如果有任何剩余内容,那将是泄漏的候选。

请注意,END {}探针可能不是正确的位置;可能需要proc::exit或类似的东西。这取决于它何时触发,在程序拆除时完成清理之前或之后(退出/终止程序将关闭其所有文件描述符,这将擦除trackedfds[]数组)。这就是为什么我在上面说这是一个起点,没有Solaris系统我无法检查。