如何在Solaris中检测文件泄漏和相应的堆栈?我看到valgrind在Linux上很好地报告了这些信息。如果我们在Solaris上有任何工具,请告诉我吗?
答案 0 :(得分:2)
在Linux上,您可以使用strace记录所有文件打开和关闭来电。然后,您可以分析资源泄漏日志 - 打开呼叫的数量应与关闭呼叫的数量相匹配。如果不是这样,那么你就有泄漏。在Solaris上有一个类似的工具 - DTrace。
答案 1 :(得分:2)
在Solaris中,您只需使用pfiles
命令即可查看当前打开的进程文件描述符。如果要跟踪正在打开/关闭的文件,可以使用truss
(相当于strace
的Solaris),并使用文件相关系统调用的过滤器(truss -e open,close
,但还有其他的创建文件描述符。)
如果您发现pfiles
输出增长,首先要确定您泄漏的是普通文件或套接字/管道之类的东西。如果它泄漏普通文件,则可以使用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); }
这构建了一个由filedescriptor编号索引的关联数组,其内容是open()
系统调用时的用户堆栈跟踪。成功关闭时,将丢弃给定filedescriptor编号的条目,并且当程序退出(或脚本停止)时,将打印所述关联数组的剩余内容 - 如果剩下任何内容,那么它将成为泄漏的候选者。 / p>
请注意,END {}
探针可能不是正确的位置;可能需要proc::exit
或类似的东西。这取决于在程序拆卸完成清理之前或之后触发的确切时间(退出/终止程序关闭其所有文件描述符,这将擦除trackedfds[]
数组)。这就是为什么我上面说过这是一个起点,没有Solaris系统我无法检查。