如何判断内存泄漏是在用户空间还是内核空间?

如何判断内存泄漏是在用户空间还是内核空间?

我有一个大型多线程开源应用程序,它使用专有的 OpenGL 库、Wayland Weston 和 Linux 内核中的专有图形驱动程序。该驱动程序目前正在开发中,因此很可能存在错误。

我观察到以下症状:

  1. free -m运行我的应用程序时,可用内存 ( ) 会不断消耗。在稳定状态下,大约消耗 1MB/5 分钟。

  2. 如果我不断地停止和启动我的应用程序,我就能加快记忆丧失的速度。看起来每次重新启动应用程序都会丢失大约 0.5MB。

  3. 当我停止应用程序时,内存不会返回到系统。仅在电源循环后才恢复内存。

  4. 我已经开始记录内存使用情况,并拍摄/proc/<pid>/smaps.我可以看到哪个线程消耗了内存,我将进一步调查。

  5. 对 smaps 文件的检查表明,随着时间的推移,较旧的快照消耗了更多的内存。anon_inode:dmabuf旧快照中还有更多条目,这看起来与以下问题类似:

    https://stackoverflow.com/questions/28097766/where-does-the-dev-zero-deleted-anon-inodedmabuf-comes-from-in-proc-p

    https://bugs.freedesktop.org/show_bug.cgi?id=100298

这种内存泄漏更有可能是用户空间内存泄漏还是内核内存泄漏?

我还可以执行哪些其他诊断来缩小可能的泄漏源范围?

答案1

应用程序是否通过 mmap() 进行任何匿名内存分配?
是否有任何数据或日志文件被写入 RAM 磁盘?有不断启动和结束的线程吗?正确处理线程终止? (去过那里,发现这是一个泄漏。)如果您稍等一下,随着动态结构的释放,内核内存使用量是否会下降?

我认为谁泄漏内存的可能性高于 99%,有利于该应用程序。

相关内容