WinDBG提供了!heap命令帮助我们查找heap,同时我们也可以通过dt和MS SYMBOL来了解memory layout。

假设我们有下面一个小程序。


int _tmain(int argc, _TCHAR* argv[])
{
char * pChar = new char[2]; pChar[0] = 'a';   delete [] pChar;
return 0;
}

在WinDbg里面启动这个程序,运行到new操作结束。这时候我们可以得到pChar指针。

我们可以通过!heap -x 来查找对应的Heap Block

!heap -x 00343818
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
-----------------------------------------------------------------------------
00343810  00343818  00340000  00340640        20        38        1e  busy extra fill 
从上面我们知道,这个heap block地址是00343810,用户内存地址是00343818,整个heap block大小是0x20。Heap Block Meta Data占据了前面8个字节 (这也解释了为什么用户内存地址的起始地址)。未使用的空间有1e(因为我们申请了2个byte) Flags是busy。

有了Heap Block地址,我们就可以运行下面命令

0:000> dt _HEAP_ENTRY 0X00343810 
ntdll!_HEAP_ENTRY
   +0x000 Size             : 4
   +0x002 PreviousSize     : 7
   +0x000 SubSegmentCode   : 0x00070004 
   +0x004 SmallTagIndex    : 0x49 'I'
   +0x005 Flags            : 0x7 ''
   +0x006 UnusedBytes      : 0x1e ''
   +0x007 SegmentIndex     : 0 ''
我们可以看到Size 是4.为什么是4了?因为这儿的单位不是byte,而是heap granularity。通常是8.所以我们可以计算:4*8=32=0x20。

我们再看一下内存布局。

0:000> dd 00343810  
00343810  00070004 001e0749 abab0198 abababab
00343820  feeeabab feeefeee 00000000 00000000

上图是每个Heap Block的说明。对比我们的memory layout,我们就可以得到类似的信息。

我们也可以下面的命令来得到更详细的信息。

0:000> !heap -i 00343810  
Detailed information for block entry 00343810
Assumed heap       : 0x00340000 (Use !heap -i NewHeapHandle to change)
Owning segment     : 0x00340000 (offset 0)
Block flags        : 0x7 (busy extra fill )
Total block size   : 0x4 units (0x20 bytes)
Requested size     : 0x2 bytes (unused 0x1e bytes)
Previous block size: 0x7 units (0x38 bytes)
Previous block     : 0x003437d8
Next block         : 0x00343830

运行完pChar[0] = 'a';这条命令,我们再看看内存。

0:000> dc 00343818
00343818  abab0161 abababab feeeabab feeefeee  a...............

我们可以看到'a'写进去了。

!heap 和 _HEAP_ENTRY的更多相关文章

  1. java head space/ java.lang.OutOfMemoryError: Java heap space内存溢出

    上一篇JMX/JConsole调试本地还可以在centos6.5 服务器上进行监控有个问题端口只开放22那么设置的9998端口 你怎么都连不上怎么监控?(如果大神知道还望指点,个人见解) 线上项目出现 ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  4. Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap

    摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...

  5. JAVA Shallow heap & Retained heap

    最近在研究内存泄漏的问题,在使用MAT工具中发现了Shallow heap & Retained heap,不懂. 然后在网上找了一些资料. Shallow Size 对象自身占用的内存大小, ...

  6. 笔记:程序内存管理 .bss .data .rodata .text stack heap

    1.未初始化的全局变量(.bss段) bss段用来存放 没有被初始化 和 已经被初始化为0 的全局变量.如下例代码: #include<stdio.h> int bss_array[102 ...

  7. STL heap usage

    简介 heap有查找时间复杂度O(1),查找.插入.删除时间复杂度为O(logN)的特性,STL中heap相关的操作如下: make_heap() push_heap() pop_heap() sor ...

  8. Nodemanager Out of heap memory[fix bug全过程]

    问题: 自己写了一个yarn上的application,发现nodemanager过段时间,会out of memory退出,把nodemanager的heap memory从1G增大到2G也是无法避 ...

  9. Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32

    今天使用Git在命令行下更新代码遇到了问题,起初觉得是自己安装某软件导致冲突,从网上搜索了一下找到类似问题,成功解决问题. 错误信息如下: E:\storm-sql>git pull origi ...

随机推荐

  1. ETL应用:一种处理接口的Pro*C实现方法

    2007年,当时项目所有ETL采用C编写,实现了ETL基本功能.当接口很多时,为保证文件获取效率,做好接口可配置:文件维护中经常会出现接口晚到情况,需要有一种方法能将接口晚到信息写入数据库,便于短信告 ...

  2. linux中获取堆栈空间大小的方法

    #include   <stdio.h> #include   <stdlib.h> #include   <sys/time.h> #include   < ...

  3. H3C光模块相关命令和检测方法

    <Sysname>  dis transceiver interface GigabitEthernet 1/0/28  查看 GigabitEthernet1/0/28 transcei ...

  4. JS实现选项卡切换效果

    1.在网页制作过程中,我们经常会用到选项卡切换效果,它能够让我们的网页在交互和布局上都能得到提升 原理:在布局好选项卡的HTML结构后,我们可以看的出来,选项卡实际上是三个选项卡标头和三个对应的版块, ...

  5. scrapy的操作

  6. numpy中的matrix与array的区别

    Numpy matrices必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array ...

  7. Python OS导入一个文件夹所有文件

    import os path = 'F:/save_file/seminarseries/' for root, dirs, files in os.walk(path): print(root) 这 ...

  8. 理解collate Chinese_PRC_CI_AS

    我们在create table时经常会碰到这样的语句,例如:password nvarchar(10)collate chinese_prc_ci_as null,那它到底是什么意思呢?不妨看看下面: ...

  9. 重写ddt的mk_test_name方法

    一. 测试用例名字的问题 使用ddt做测试,得到的测试报告中,测试用例的名字默认以_01, _02, _03...递增的形式结尾,这时我希望用例名能够以_api_name结尾,比如注册模块,希望看到的 ...

  10. JAX-RS介绍——Java API forRESTful WebServices,JAX-RS的目标是Web Services开发(这与HTML Web应用不同)而Spring MVC的目标则是Web应用开发

    JAX-RS Java API forRESTful WebServices旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架.是一个J ...