2011-07-18 56 views
1

这个问题纯粹是理论上的。Linux中是否有内存泄漏?

我想知道的Linux源代码是否可能有内存泄漏,以及它们如何调试它,毕竟,考虑到它是Linux,它处理每个程序的内存?

我明明知道,Linux的,被写在C,有mallocfree处理本身。我不明白的是我们如何衡量操作系统的内存泄漏。

请注意,这个问题不是Linux专用的;它还解决了Windows和MacOS X(达尔文)中的相应问题。

+2

很可能,是的,某处存在内存泄漏。没有一次内存泄漏就写出那么多代码几乎是不可能的(即使你是世界上最好的C程序员)。至于他们如何调试它,idk。 –

+2

所有代码都有错误;其中一些错误会导致内存泄漏。这包括操作系统代码。但是,由于操作系统需要运行几天/几周/几个月而无需重新启动,因此可以预期这些错误将被最小化为较小的级别。 –

+0

所有的代码都有bug ...呃不是我的!决不!至少我没有发现任何和我的用户没有任何报告..没有我! – JonH

回答

3

非常频繁的非主流驱动程序和分段树有内存泄漏。按照LKML,您可以偶尔找到处理SKB列表的角落案例网络代码中的错误修复。

由于内核的性质最多的工作是代码审查和重构,但工作正在进行,以使更多的工具:

http://www.linuxfoundation.org/en/Google_Summer_of_Code#kmemtrace_-_Kernel_Memory_Profiler

在某些情况下,你可以使用框架,如用户模式Linux和再利用像Valgrind的常规工具,试图窥视运行代码:

http://user-mode-linux.sourceforge.net/

1

malloc和free(实际上是brk/sbrk,因为malloc和free由libc in-process实现)的实现不是神奇或特殊的 - 它只是代码,就像其他任何东西一样,并且它背后有数据结构描述映射。

如果您想测试正确的行为,一种方法是在用户空间编写测试程序,这些测试程序已知可以分配,然后正确释放所有内存。运行应用程序,然后使用调试器在内核模式下检查内部内存分配结构(或者更好,在进程关闭时检查调试断言)。

+0

这应该检查'malloc'和'free'是否正常工作,但操作系统代码如何? –

+0

这是内核调试器进来的地方。 –

1

所有的软件都有漏洞,包括操作系统。其中一些错误会导致内存泄漏。

Linux有一个内核调试程序来帮助追踪这些事情,但是人们必须发现它们存在才能追踪它们。通常,一旦发现错误并且可以随意复制,修复就变得更容易了(相对来说,显然你需要一个好的编码器来完成这项工作)。最难的部分是首先找到缺陷并​​创建可靠的测试用例来证明它们。这是您需要拥有熟练的QA团队的地方。

所以我想这个答案的简短版本是,良好的质量保证是一样重要的良好编码。