Solaris 模块调试器指南

内核内存分配器

本节讨论用于调试 Solaris 内核内存分配器所识别的问题以及检查内存和内存使用情况的 dcmd 和 walker。第 9 章,使用内核内存分配器进行调试中对此处所述的 dcmd 和 walker 进行了更详细的讨论。

dcmd

thread ::allocdby

在指定内核线程的地址的情况下,按反向时间顺序列显其已执行的内存分配的列表。

bufctl ::bufctl [-a address] [-c caller] [-e earliest] [-l latest] [-t thread]

列显指定的 bufctl addressbufctl 信息摘要。 如果存在一个或多个选项,则仅当 bufctl 与选项参数所定义的条件匹配时才会列显其信息;这样,可将 dcmd 用作来自管道的输入的过滤器。 -a 选项表示 bufctl 的对应缓冲区地址必须等于指定的地址。 -c 选项表示指定的调用方的程序计数器值必须存在于 bufctl 的已保存栈跟踪中。 -e 选项表示 bufctl 的时间标记必须晚于或等于指定的最早时间标记。 -l 选项表示 bufctl 的时间标记必须早于或等于指定的最早时间标记。 -t 选项表示 bufctl 的线程指针必须等于指定的线程地址。

[ address ] ::findleaks [-v]

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

如果指定了 -v 选项,则 dcmd 在执行时会列显更详细的消息。 如果在 dcmd 前面指定了显式地址,则将过滤报告,并仅显示其分配栈跟踪包含指定函数地址的泄漏。

thread ::freedby

在指定内核线程的地址的情况下,按反向时间顺序列显其已执行的内存释放的列表。

value ::kgrep

在内核地址空间中搜索包含指定的指针大小值的指针对齐地址。 然后,列显包含匹配值的地址的列表。与 MDB 的内置搜索运算符不同,::kgrep 可搜索每段内核地址空间,并跨不连续的段边界搜索。 在大内核上,执行 ::kgrep 可能需要相当长的时间。

::kmalog [ slab | fail ]

显示内核内存分配器的事务日志中的事件。 事件按反向时间顺序显示,首先显示最新的事件。对于每个事件,::kmalog 都显示相对于最新事件的时间(用 T-差值表示法表示,例如 T-0.000151879)、bufctl、缓冲区地址、kmem 高速缓存名称和事件发生时的栈跟踪。 如果没有参数,则 ::kmalog 将显示 kmem 事务日志(仅当 kmem_flags 中设置 KMF_AUDIT 时它才存在)。::kmalog fail 显示分配失败日志,该日志会始终存在;这有助于调试未正确处理分配失败的驱动程序。::kmalog slab 显示长字节创建日志,该日志会始终存在。::kmalog slab 有助于搜索内存泄漏。

::kmastat

显示内核内存分配器高速缓存和虚拟内存块 (arena) 的列表,以及对应的统计信息。

::kmausers [-ef] [cache ...]

列显有关具有当前内存分配的内核内存分配器的中等用户和大用户的信息。对于每个唯一的栈跟踪,输出都包含一个项,用于指定总内存量和在该栈跟踪中进行的分配数。此 dcmd 要求在 kmem_flags 中设置 KMF_AUDIT 标志。

如果指定了一个或多个高速缓存名称(例如 kmem_alloc_256),则对内存使用情况的扫描仅限于那些高速缓存。 缺省情况下,包括所有高速缓存。 如果使用了 -e 选项,则包括分配器的小用户。 小用户是总数小于 1024 字节内存的分配或者同一栈跟踪中的分配数小于 10 的分配。 如果使用了 -f 选项,则会针对每个单独的分配列显栈跟踪。

[ address ] ::kmem_cache

对指定地址上存储的 kmem_cache 结构或完整的活动 kmem_cache 结构集进行格式设置和显示。

::kmem_log

显示完整的 kmem 事务日志集(按反向时间顺序排列)。 此 dcmd 使用比 ::kmalog 更简明的表格输出格式。

[ address ] ::kmem_verify

验证在指定地址上存储的 kmem_cache 结构或完整的活动 kmem_cache 结构集的完整性。如果指定了显式高速缓存地址,则 dcmd 会显示有关错误的详细信息;否则,显示摘要报告。内核内存高速缓存中对 ::kmem_verify dcmd 进行了更详细的讨论。

[ address ] ::vmem

对在指定地址上存储的 vmem 结构或完整的活动 vmem 结构集进行格式设置和显示。此结构在 <sys/vmem_impl.h> 中定义。

address ::vmem_seg

对在指定地址上存储的 vmem_seg 结构进行格式设置和显示。此结构在 <sys/vmem_impl.h> 中定义。

address ::whatis [-abv]

报告有关指定地址的信息。 具体来说,::whatis 会尝试确定该地址是指向 kmem 管理的缓冲区的指针还是其他类型的特殊内存区域(如线程栈),然后报告其判定结果。 如果存在 -a 选项,则 dcmd 会向其查询报告所有匹配项,而不仅仅是第一个匹配项。 如果存在 -b 选项,则 dcmd 还会尝试确定该地址是否通过已知的 kmem bufctl 被引用。 如果存在 -v 选项,则 dcmd 在搜索各种内核数据结构时会报告其进度。

Walker

allocdby

在指定 kthread_t 结构的地址作为起点的情况下,迭代与此内核线程执行的内存分配相对应的 bufctl 结构集。

bufctl

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的分配的 bufctl 集。

freectl

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的空闲 bufctl 集。

freedby

在指定 kthread_t 结构的地址作为起点的情况下,迭代与此内核线程执行的内存取消分配相对应的 bufctl 结构集。

freemem

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的空闲缓冲区集。

kmem

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的分配的缓冲区集。

kmem_cache

迭代活动的 kmem_cache_t 结构集。 此结构在 <sys/kmem_impl.h> 中定义。

kmem_cpu_cache

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的每个 CPU 的 kmem_cpu_cache_t 结构。 此结构在 <sys/kmem_impl.h> 中定义。

kmem_slab

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代关联的 kmem_slab_t 结构集。 此结构在 <sys/kmem_impl.h> 中定义。

kmem_log

迭代存储在 kmem 分配器事务日志中的 bufctl 集。

leak

在指定 bufctl 结构的地址的情况下,迭代与具有类似分配栈跟踪的泄漏内存缓冲区相对应的 bufctl 结构集。必须首先应用 ::findleaks dcmd 查找内存泄漏,然后才能使用 leak walker。

leakbuf

在指定 bufctl 结构的地址的情况下,迭代与具有类似分配栈跟踪的泄漏内存缓冲区相对应的缓冲区地址集。必须首先应用 ::findleaks dcmd 查找内存泄漏,然后才能使用 leakbuf walker。