本帖最后由 buzhifou01 于 2019-12-23 21:35 编辑
1.前言
使用windbg查看进程堆中的信息,可以帮助技术人员判断系统是否发生堆溢出,进程中的堆大体上分为两种:NT堆和段堆。在NT堆和段堆中都含有低碎片化堆,接下来讲解查看NT堆和段堆信息的命令及使用。
2.堆命令
[Asm] 纯文本查看 复制代码 !heap [HeapOptions] [ValidationOptions] [Heap]
!heap -b [{alloc|realloc|free} [Tag]] [Heap | BreakAddress]
!heap -B {alloc|realloc|free} [Heap | BreakAddress]
!heap -l
!heap -s [SummaryOptions] [StatHeapAddress]
!heap -i HeapAddress
!heap -x [-v] Address
!heap -p [PageHeapOptions]
!heap -srch [Size] Pattern
!heap -flt FilterOptions
!heap -stat [-h Handle [-grp GroupBy [MaxDisplay]]]
!heap [-p] -?
!heap -triage [Handle | Address]
3.详解命令
3.1NT堆和段堆共有命令
[Asm] 纯文本查看 复制代码 !heap -s [SummaryOptions] [StatHeapAddress]
该命令可以显示某个堆的所有信息。 如果省略了SummaryOptions和StatHeapAddress,那么将显示与当前进程关联的所有堆的全部信息。
[SummaryOptions] 命令如下: 命令 | 介绍 | -v | 验证所有块的信息(发现有没有块已损坏) | -b | 指定bucket大小(低碎片堆中的bucket),默认是1024bit | -d | 指定bucket大小(低碎片堆中的bucket) | -a | 转储所有堆块 | -c | 指定每个块应该分配的内容 |
[Asm] 纯文本查看 复制代码 !heap -triage [Handle | Address]
使windbg自动搜索进程堆中的故障。 如果将堆句柄指定为参数,则会检查该堆, 否则,将在所有堆中搜索包含给定地址的堆,并对这些堆进行检查。 使用-triage是验证低碎片堆(LFH)损坏的唯一方法。
[Asm] 纯文本查看 复制代码 !heap -x [-v] Address
使windbg搜索包含指定地址的堆块。 如果添加了-v,该命令将在当前进程的整个虚拟内存空间中搜索指向此堆块的指针。
使windbg检测泄漏的堆块。
[Asm] 纯文本查看 复制代码 !heap -i HeapAddress
显示有关指定堆的信息。
[Asm] 纯文本查看 复制代码 !heap [-p] -?
在“调试器命令”窗口中显示此扩展名的简短帮助文本。 使用!heap-? 寻求一般帮助,以及!heap -p-? 获取页面堆帮助。
3.2NT 堆命令
接下来列出的命令只能用在NT堆中
[Asm] 纯文本查看 复制代码 !heap [HeapOptions] [ValidationOptions]
[HeapOptions] 处的命令如下:
命令 | 介绍 | -v | 验证指定的堆(验证堆有没有损坏,不能验证低碎片化堆) | -a | 显示指定堆中的所有信息 | -h | 显示指定堆的所有非LFH项信息 | -hl | 显示指定堆的所有项信息,包括LFH。 | -f | 显示指定堆中空闲内存项信息。 | -m | 显示指定堆的所有段信息。 | -t | 显示指定堆的标签信息。 | -T | 显示指定堆的伪标记信息。 | -g | 显示全局标签信息。全局标记与每个未标记的分配相关联。 | -s | 显示指定堆的统计信息。 | -k | 显示与每个项关联的堆栈回溯。 | [ValidationOptions] 处的命令如下:
命令 | 介绍 | -D | 禁用指定堆的调用验证。 | -E | 为指定的堆启用验证。 | -d | 禁用对指定堆的堆检查。 | -e | 对指定的堆启用堆检查。 |
3.3其他堆指令
3.3.1中断命令
[Asm] 纯文本查看 复制代码 !heap -b [{alloc|realloc|free} [Tag]] [ BreakAddress]
使windbg在堆中创建条件断点。 -b选项后可以是alloc,realloc或free; 它指定是通过分配,重新分配还是释放内存来激活断点。 如果使用BreakAddress指定块的地址,则可以省略断点类型。 如果使用堆来指定堆地址或堆索引,则必须包括类型以及Tag参数。
[Asm] 纯文本查看 复制代码 !heap -B {alloc|realloc|free} [BreakAddress]
使windbg从堆中删除条件断点。 必须指定断点类型(分配,重新分配或空闲),并且必须与-b选项使用的断点类型相同。
3.3.2页堆命令
[Asm] 纯文本查看 复制代码 !heap -p [PageHeapOptions]
显示指定页面堆信息。 如果不使用PageHeapOptions,则将显示所有页面堆。
[PageHeapOptions]命令如下:
命令 | 介绍 | -h | 使windbg显示有关带有句柄的页面堆的详细信息。 | -a | 使windbg找到指定地址块中的页面堆。详细显示指定地址块与全页堆块相关的全部信息 | -t[c|s] | 使windbg显示重堆信息 | -fi | 使windbg显示最新的错误信息 | -all | 使windbg显示有关所有页面堆的信息 | -? | 使windbg显示页面堆帮助,包括堆块图 | 3.3.3过滤,搜索,统计命令
[Asm] 纯文本查看 复制代码 !heap -srch [Size] Pattern
扫描给定Pattern中所有堆
[Size]命令如下:
命令 | 介绍 | -b | Pattern为一字节大小 | -w | Pattern为一字大小 | -d | Pattern为一双字大小 | -q | Pattern为一四字大小 |
[Asm] 纯文本查看 复制代码 !heap -flt FilterOptions
显示指定大小或范围大小的堆。
[FilterOptions]命令如下:
命令 | 介绍 | s | 显示指定大小的堆 | r | 显示指定范围大小的堆 |
[Asm] 纯文本查看 复制代码 !heap -stat [-h Handle [-grp GroupBy [MaxDisplay]]]
显示指定堆的统计信息
-h Handle
显示Handle处堆的使用情况。 如果Handle为0或省略,则显示所有堆的使用情况。
-grp GroupBy
GroupBy处的命令如下
命令 | 介绍 | A | 根据分配大小显示使用情况统计信息 | B | 根据块的数量显示使用情况统计信息 | S | 根据每个分配的总大小显示使用情况统计信息 | [MaxDisplay]
限制输出行数。
4.命令使用
1.用!heap -h显示进程中所有堆的项(不含低碎片化堆)信息。显示 Unable to read _HEAP_SEGMENT structure at 0000000000000000的堆是段堆
2.用!heap -s 显示某个堆的统计信息
3.!heap -x -v显示某个堆中所有块的信息
4.!heap -stat -h显示指定堆的统计信息
5.!heap -flt r 0x50 0x80 显示大小介于0x50和0x80之间的页堆
6.!heap -p -a输出页堆信息
|