Solaris中如何检测文件泄漏以及相应的代码
How to detect file leak and the corresponding code in Solaris?
如何检测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系统我无法检查。
- 为什么以下C++代码中存在内存泄漏?
- 无法找出我的代码中的内存泄漏
- 如何防止使用 std::shared_ptr 的代码中的内存泄漏
- 为什么当为T2抛出bad_alloc异常时,此代码中会发生内存泄漏
- 以下代码是否存在内存泄漏?
- C++/CLI 代码中的内存泄漏
- 客户端代码中的 Valgrind 钩子:特定函数的内存泄漏
- 我的C++代码中是否有一些内存泄漏
- 为什么 heob 在 QCreator 生成的代码中将这些检测为内存泄漏
- 尝试在我的 C++ 代码中查找内存泄漏
- 以下代码中的嵌入"new"是否会导致内存泄漏?
- 如何解决C++代码中的内存泄漏问题
- 泄漏测试代码shared_ptr奇怪的结果
- 内存泄漏在0行代码中
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- QaudioOutput代码是否有任何内存泄漏
- 此代码是否会导致内存泄漏问题
- 避免在JNI代码中的内存泄漏
- 如果您以Java JNI分配的本机代码中的内存泄漏,会发生什么
- 你能在这个代码中找到 4 字节的内存泄漏吗?