Solaris 模块调试器指南

查找内存泄漏

对于启用了完整 kmem 调试功能集的内核崩溃转储,::findleaks dcmd 提供了提供了强大高效的内存泄漏检测。 首次执行 ::findleaks 时会处理转储中的内存泄漏(这可能需要几分钟),然后根据分配栈跟踪合并泄漏。 findleaks 报告会针对所识别的每个内存泄漏显示一个 bufctl 地址和最顶层的栈帧:

> ::findleaks

CACHE     LEAKED   BUFCTL CALLER

70039ba8       1 703746c0 pm_autoconfig+0x708

70039ba8       1 703748a0 pm_autoconfig+0x708

7003a028       1 70d3b1a0 sigaddq+0x108

7003c7a8       1 70515200 pm_ioctl+0x187c

------------------------------------------------------

   Total       4 buffers, 376 bytes

使用 bufctl 指针可以通过应用 bufctl_audit 宏获取分配的完整栈反向跟踪:

> 70d3b1a0$<bufctl_audit

0x70d3b1a0:     next            addr            slab

                70a049c0        70d03b28        70bb7480

0x70d3b1ac:     cache           timestamp       thread

                7003a028        13f7cf63b3      70b38380

0x70d3b1bc:     lastlog         contents        stackdepth

                700d6e60        0               5

0x70d3b1c8:

                kmem_alloc+0x30

                sigaddq+0x108

                sigsendproc+0x210

                sigqkill+0x90

                kill+0x28

程序员通常可以使用 bufctl_audit 信息和分配栈跟踪快速找到泄漏给定缓冲区的代码路径。